matplotlib and/or seaborn 中旋转轴标签的均匀间距
Even spacing of rotated axis labels in matplotlib and/or seaborn
旋转解决方案 here and/or 适用于长度相似的标签。但是位置似乎是基于标签的中间,所以如果标签名称的长度不均匀,则间距会关闭。
以下代码会导致外观不均匀。
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.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 指出的那样,我想我真的想要一个 "rightward horizontal alignment" 标签(即使使用文本换行)。这可能吗?
如果您想使用 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()
结果:
旋转解决方案 here and/or
以下代码会导致外观不均匀。
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.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 指出的那样,我想我真的想要一个 "rightward horizontal alignment" 标签(即使使用文本换行)。这可能吗?
如果您想使用 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()
结果: