gpt4 book ai didi

python - matplotlib - 在图例中包装文本

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:47 24 4
gpt4 key购买 nike

我目前正在尝试通过 matplotlib/seaborn 绘制一些 pandas 数据,但是我的一个专栏标题特别长并且延伸剧情。考虑以下示例:

import random

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')

random.seed(22)
fig, ax = plt.subplots()

df = pd.DataFrame({'Year': [2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
'One legend label': [random.randint(1,15) for _ in range(10)],
'A much longer, much more inconvenient, annoying legend label': [random.randint(1, 15) for _ in range(10)]})

df.plot.line(x='Year', ax=ax)
ax.legend(bbox_to_anchor=(1, 0.5))
fig.savefig('long_legend.png', bbox_inches='tight')

这会产生下图: graph with wide legend

有什么方法可以将图例条目设置为按字符或长度换行?我尝试在绘制之前使用 textwrap 重命名 DataFrame 列:

import textwrap
[...]
renames = {c: textwrap.fill(c, 15) for c in df.columns}
df.rename(renames, inplace=True)
[...]

但是,pandas 似乎忽略了列名中的换行符。

最佳答案

您可以使用 textwrap.wrap 来调整您的图例条目(在 this answer 中找到),然后在对 ax.legend() 的调用中更新它们.

import random
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from textwrap import wrap

sns.set_style('darkgrid')

df = pd.DataFrame({'Year': [2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
'One legend label': [random.randint(1,15) for _ in range(10)],
'A much longer, much more inconvenient, annoying legend label': [random.randint(1, 15) for _ in range(10)]})

random.seed(22)
fig, ax = plt.subplots()

labels = [ '\n'.join(wrap(l, 20)) for l in df.columns]

df.plot.line(x='Year', ax=ax,)
ax.legend(labels, bbox_to_anchor=(1, 0.5))

plt.subplots_adjust(left=0.1, right = 0.7)
plt.show()

给出:

enter image description here

更新:正如评论中所指出的,documentationtextwrap.fill()'\n'.join(wrap(text, ...)) 的简写。因此,您可以改用:

from textwrap import fill
labels = [fill(l, 20) for l in df.columns]

关于python - matplotlib - 在图例中包装文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47057789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com