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