甚至在matplotlib和/或seaborn

时间:2017-04-25 18:32:54

标签: python matplotlib seaborn

旋转解决方案here和/或here适用于长度相似的标签。但是位置似乎是基于标签的中间位置,因此如果标签名称的长度不均匀,则间距会关闭。

以下代码会产生不均匀的外观。

frame = pd.DataFrame(np.random.random((10, 4)), columns=[
    'Medium Name', 'Really Really Long Name', 'Name', 
    'Ridiculously Good Looking and Long Name'
])
ax = sns.barplot(data=frame)
plt.xticks(rotation=45)

我尝试调整类似于this question的间距,但这是一个烦人的手动猜测过程,让它看起来正确。添加行ax.axes.set_xticks([-0.2,0.6,2,2.3])大致创建了我认为合适的间距(列中心的字符串末尾),但是是否有基于标签末尾而不是中间的自动中心方式?或者可能包装字符串以使所有标签的长度相同?

编辑: 显示即使是合理长度的标签会发生什么:

cols = ['Tag' + str(i) for i in range(8)]
cols[2] = 'Not Crazy Long'
cols[4] = 'Also Not Too Bad'
frame = pd.DataFrame(np.random.random((10, 8)), columns=cols)
ax = sns.barplot(data=frame)
plt.xticks(rotation=35)

Result here

我喜欢文字自动换行解决方案,但正如@mwaskom指出的那样,我想我真的想要一个"向右的水平对齐"标签(即使使用文本换行)。这可能吗?

1 个答案:

答案 0 :(得分:0)

如果您想使用textwrap,您可以获得列的平均长度并将其用作包装值:

import numpy as np, seaborn as sns
import textwrap

columns=['Medium Name', 'Really Really Long Name', 'Name',
         'Ridiculously Good Looking and Long Name']
mean_length = np.mean([len(i) for i in columns])
columns = ["\n".join(textwrap.wrap(i,mean_length)) for i in columns]
frame = pd.DataFrame(np.random.random((10, 4)), columns=columns)
ax = sns.barplot(data=frame)
ax.set_xticklabels(ax.get_xticklabels(),rotation=45,ha="right",rotation_mode='anchor')
plt.tight_layout()
plt.show()

结果: enter image description here