Python matplotlib和/或seaborn中旋转轴标签的均匀间距

Python matplotlib和/或seaborn中旋转轴标签的均匀间距,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,旋转解决方案和/或适用于所有长度相似的标签。但是,位置似乎基于标签的中间,因此,如果标签名称的长度不均匀,则间距将关闭 下面的代码会产生间距不均的外观 frame = pd.DataFrame(np.random.random((10, 4)), columns=[ 'Medium Name', 'Really Really Long Name', 'Name', 'Ridiculously Good Looking and Long Name' ]) ax = sns.bar

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

下面的代码会产生间距不均的外观

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)

我试着调整类似于的间距,但这是一个恼人的手动猜测过程,以使其看起来正确。添加行
ax.axes.setxticks([-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)

我喜欢文本换行解决方案,但正如@mwaskom指出的,我想我真的希望标签“向右水平对齐”(即使使用文本换行)。这可能吗?

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

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()
结果:

问题不在于间距不均匀,而在于标高具有水平居中对齐。我想你需要一个向右的水平线。顺便说一句,对于带有长标签的条形图,通常最好画水平条,因为即使在对齐正确的情况下,也必须倾斜头部才能阅读长标签,这很烦人。PPS这不是“in seaborn”问题-在指定记号标签的方向/对齐点时,这是一个关于matplotlib的问题,该绘图是否由seaborn绘制是不相关的。谢谢@mwaskom,我明白你关于水平条形图和seaborn问题的观点-尽管我希望在seaborn中有一种方法可以做到这一点,因为它比直接处理matplotlib要好得多:)我也理解水平居中-我在问题中提到过,但会尝试更新以更清楚。即使对于不太长的标签,这也会导致一些看起来很傻的图形(也会随之更新),因此最好有一个标准的方法来更改居中方式。似乎在某种程度上可能会出现在seaborn驾驶室中,因为我相信旋转标签在统计可视化方面是相当标准的感谢@ImportanceOfBeingErnest-以及
ax.set\xticklabels(ax.get\xticklabels(),rotation=45,ha=“right”)
就是这样!我最初没有找到另一个帖子,因为我正在寻找seaborn——我应该仍然标记为dup吗?请参见vs中的记号旋转示例。考虑到FaceGrid是seaborn对象,情况略有不同,但最流行的答案似乎是使用matplotlib接口。想法?谢谢-还有
ax.set\xticklabels(ax.get\xticklabels(),rotation=45,ha=“right”)
我的标签现在很完美!不客气@elz我建议添加
rotation\u mode='anchor
。谢谢你,@PaulH。我将修改答案。