2017-04-25 175 views
1

旋转解决方案here和/或here适用于所有长度相似的标签。但是,位置似乎基于标签的中间位置,因此如果标签名称长度不均匀,间距就会关闭。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.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指出,我想我真的想标签的“向右水平对齐”(即使使用文本包装)。这可能吗?

+0

的问题不在于间距不均匀,但水平具有水平居中对齐。你想要一个向右的水平线,我想。顺便说一句,对于长条形标签的条形图来说,绘制水平条通常会更好,因为即使排列正确时,也不得不倾斜头部以读取长条形标签。 – mwaskom

+0

PPS这不是一个“在seaborn”问题 - 在你指定刻度标签的方向/对齐的地方,这是一个关于matplotlib的问题,以及这个情节是否是用seaborn制作的是无关紧要的。 – mwaskom

+0

谢谢@mwaskom,我看到你关于横向barplot和seaborn问题的观点 - 尽管我希望有一种方法可以在seaborn中实现,因为它比直接处理matplotlib好得多:) – elphz

回答

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

+1

谢谢 - 与'ax.set_xticklabels(ax。get_xticklabels(),rotation = 45,ha =“right”)'我的标签现在完美了! – elphz

+0

非常欢迎! – bernie

+1

@elz我建议添加'rotation_mode ='anchor'。 –