【问题标题】:Even spacing of rotated axis labels in matplotlib and/or seaborn [duplicate]matplotlib和/或seaborn中旋转轴标签的均匀间距[重复]
【发布时间】:2017-09-22 22:12:45
【问题描述】:

旋转解决方案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 指出的那样,我想我真的想要标签的“向右水平对齐”(即使使用文本换行)。这可能吗?

【问题讨论】:

  • 问题不在于间距不均匀,而是水平居中对齐。我想你想要一个向右的水平对齐。顺便说一句,对于带有长标签的条形图,通常最好画水平条,因为即使对齐正确,也必须倾斜头部才能阅读长标签。
  • PPS 这不是一个“in seaborn”问题——在您指定刻度标签的方向/对齐方式时,这是一个关于 matplotlib 的问题,并且该图是否由 seaborn 制作无关紧要.
  • 谢谢@mwaskom,我看到了你关于水平条形图和seaborn问题的观点——尽管我希望在seaborn中能做到这一点,因为它是如此比直接处理 matplotlib 好得多:)
  • 我也了解水平居中 - 我在问题中提到了它,但会尝试更新以更清晰。即使对于不是很长的标签,这也可能导致一些看起来很傻的图表(也会随之更新),所以最好有一个标准的方法来改变居中的完成方式。似乎某些时候可能会出现在 seaborn 驾驶室中,因为我相信旋转标签在统计可视化中是相当标准的
  • 感谢@ImportanceOfBeingErnest - 以及ax.set_xticklabels(ax.get_xticklabels(), rotation = 45, ha="right") 做到了!我最初没有找到其他帖子,因为我正在寻找 seaborn - 我还应该标记为 dup 吗?例如,请参阅 seabornmatplotlib 中的刻度轮换。考虑到 facetgrid 是 seaborn 对象,略有不同,但最流行的答案似乎是使用 matplotlib 接口。想法?

标签: python matplotlib seaborn


【解决方案1】:

如果您想使用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()

结果:

【讨论】:

  • 谢谢 - 连同 ax.set_xticklabels(ax.get_xticklabels(), rotation = 45, ha="right") 我的标签现在完美了!
  • 不客气!
  • @elz 我建议添加rotation_mode='anchor
  • 谢谢你,@PaulH。我会修改答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2017-05-25
  • 2015-03-19
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多