matplotlib-在图例中换行 [英] matplotlib - wrap text in legend

查看:200
本文介绍了matplotlib-在图例中换行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前正在尝试通过matplotlib/seaborn绘制一些pandas数据,但是我的一列标题特别长,并且会延长该图的时间.考虑以下示例:

I am currently trying to plot some pandas data via matplotlib/seaborn, however one of my column titles is particularly long and stretches out the plot. Consider the following example:

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')

这将产生以下图形:

This produces the following graph:

有什么方法可以设置图例条目以换行,无论是字符还是长度?我尝试使用textwrap重命名DataFrame列,然后再进行如下绘制:

Is there any way that I can set the legend entries to wrap, either on a character or a length? I tried to use textwrap to rename the DataFrame columns prior to plotting like so:

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

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

However, pandas seemed to ignore the newlines in the column names.

推荐答案

您可以使用textwrap.wrap来调整图例条目(可在

You can use textwrap.wrap in order to adjust your legend entries (found in this answer), then update them in the call to 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()

哪个给:

更新:如评论中所指出的,文档说,textwrap.fill()'\n'.join(wrap(text, ...))的简写.因此,您可以改为使用:

Update: As pointed out in the comments, the documentation says textwrap.fill() is shorthand for '\n'.join(wrap(text, ...)). Therefore you can instead use:

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

这篇关于matplotlib-在图例中换行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆