我目前正在尝试通过pandas
/ matplotlib
绘制一些seaborn
数据,但是我的一个列标题特别长,并且延伸了情节。请考虑以下示例:
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')
有没有什么办法可以设置图例条目来包装,无论是字符还是长度?我尝试使用textwrap
重命名DataFrame列,然后进行绘图:
import textwrap
[...]
renames = {c: textwrap.fill(c, 15) for c in df.columns}
df.rename(renames, inplace=True)
[...]
但是,pandas
似乎忽略了列名中的换行符。
答案 0 :(得分:4)
您可以使用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()
给出了:
更新:正如评论中所指出的,documentation说textwrap.fill()
是'\n'.join(wrap(text, ...))
的简写。因此,您可以改为使用:
from textwrap import fill
labels = [fill(l, 20) for l in df.columns]
答案 1 :(得分:-1)
正如@Jan Zeiseweis所提到的,你可以在文本中多次使用\ n(例如'更长,更不方便,\ n令人讨厌的传奇标签') 如果您对此非常灵活,可以将图例放在图下方,以通过指定2列来获得更好的可视化:
ax.legend(bbox_to_anchor=(0.9, -0.15),ncol=2,fontsize=8)