减少matplotlib图中的xticklabels区域

时间:2017-10-18 15:32:03

标签: python matplotlib plot axis-labels

我的x轴刻度标签(下图中的那些)正在从整体图中窃取宝贵的空间。我试图通过更改文本旋转来减小其大小,但由于文本标签很长,所以这并没有多大帮助。

是否有更好的方法来减少xticklabel区域占用的空间?例如,我可以在条形图中显示此文本吗?感谢您的支持。

我的图表设置代码是:

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = "Century Gothic"
matplotlib.rcParams['font.family'] = "Century Gothic"

ax = df1.plot.bar(x = '', y = ['Events Today', 'Avg. Events Last 30 Days'], rot = 25, width=0.8 , linewidth=1, color=['midnightblue','darkorange'])

for item in ([ax.xaxis.label, ax.yaxis.label] +
         ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(15)

ax.legend(fontsize = 'x-large', loc='best')
plt.tight_layout()
ax.yaxis.grid(True, which='major', linestyle='-', linewidth=0.15)
ax.set_facecolor('#f2f2f2')
plt.show()

enter image description here

1 个答案:

答案 0 :(得分:1)

当我最终得到非常长的xticklabels时,我做的第一件也是最重要的事情就是尽量缩短它们。这似乎很明显,但值得指出的是,使用缩写或不同的描述通常是最简单和最有效的解决方案。

如果您遇到长名称和某些字体大小,我建议改为使用水平条形图。我通常更喜欢具有较长标签的水平图,因为它更容易阅读未旋转的文本(这也可能使字体大小更进一步减少)添加换行也可以提供帮助。

以下是包含笨重标签的图表示例:

import pandas as pd
import seaborn as sns # to get example data easily

iris = sns.load_dataset('iris')
means = iris.groupby('species').mean()
my_long_labels = ['looooooong_versicolor', 'looooooooog_setosa', 'looooooooong_virginica']
# Note the simpler approach of setting fontsize compared to your question
ax = means.plot(kind='bar', y=['sepal_length', 'sepal_width'], fontsize=15, rot=25)
ax.set_xlabel('')
ax.set_xticklabels(my_long_labels)

enter image description here

我会将其更改为水平条形图:

ax = means.plot(kind='barh', y=['sepal_length', 'sepal_width'], fontsize=15)
ax.set_ylabel('')
ax.set_yticklabels(my_long_labels)

enter image description here

您可以在标签中引入换行符,以进一步提高可读性:

ax = means.plot(kind='barh', y=['sepal_length', 'sepal_width'], fontsize=15, rot=0)
ax.set_ylabel('')
ax.set_yticklabels([label.replace('_', '\n') for label in my_long_labels])

enter image description here

这也适用于竖条:

ax = means.plot(kind='bar', y=['sepal_length', 'sepal_width'], fontsize=15, rot=0)
ax.set_xlabel('')
ax.set_xticklabels([label.replace('_', '\n') for label in my_long_labels])

enter image description here

最后,您还可以在条形图中找到文字,但这很难理解。

ax = means.plot(kind='barh', y=['sepal_length', 'sepal_width'], fontsize=15)
ax.set_ylabel('')
ax.set_yticklabels(my_long_labels, x=0.03, ha='left', va='bottom')

enter image description here