【问题标题】:How to ensure even spacing between labels on x axis of matplotlib graph?如何确保matplotlib图x轴上标签之间的间距均匀?
【发布时间】:2019-03-05 09:35:52
【问题描述】:

我得到了一个数据,我需要找到一个histogram。所以我使用了 pandas hist() 函数并使用 matplotlib 绘制它。该代码在远程服务器上运行,因此我无法直接看到它,因此我保存了图像。这是图片的样子

下面是我的代码

import matplotlib.pyplot as plt

df_hist = pd.DataFrame(np.array(raw_data)).hist(bins=5) // raw_data is the data supplied to me
plt.savefig('/path/to/file.png')
plt.close()

如您所见,x 轴标签是重叠的。所以我像这样使用了这个函数plt.tight_layout()

import matplotlib.pyplot as plt

df_hist = pd.DataFrame(np.array(raw_data)).hist(bins=5)
plt.tight_layout()
plt.savefig('/path/to/file.png')
plt.close()

现在有一些改进

但标签仍然太近了。有没有办法确保标签不会相互接触并且它们之间有公平的间距?我还想调整图像大小以使其更小。

我在这里查看了https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html 的文档,但不确定savefig 使用哪个参数。

【问题讨论】:

  • 您愿意旋转 x 轴标签吗? This 可能会有所帮助。或者,您可以在单位名称中使用“kilo”,然后简单地将它们全部除以 1000?
  • 使用plt.tick_params(axis='x', which='major', labelsize=__)

标签: python matplotlib


【解决方案1】:

由于raw_data 还不是pandas 数据框,因此无需将其变成一个数据框来进行绘图。相反,您可以直接使用 matplotlib 绘图。

有许多不同的方法可以实现您想要的。我将首先设置一些与您的数据相似的数据:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gamma

raw_data = gamma.rvs(a=1, scale=1e6, size=100)

如果我们继续使用 matplotlib 创建直方图,我们可能会发现 xticks 靠得太近了:

fig, ax = plt.subplots(1, 1, figsize=[5, 3])
ax.hist(raw_data, bins=5)
fig.tight_layout()

无论间距如何,所有零都很难读取 xticks。因此,您可能希望做的一件事是使用科学格式。这使得 x 轴更容易解释:

ax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

不使用科学格式的另一种选择是旋转刻度(如 cmets 中所述):

ax.tick_params(axis='x', rotation=45)
fig.tight_layout()

最后,您还提到了更改图像的大小。请注意,这最好在图形初始化时完成。您可以使用 figsize 参数设置图形的大小。以下将创建一个 5" 宽和 3" 高的图形:

fig, ax = plt.subplots(1, 1, figsize=[5, 3])

【讨论】:

    【解决方案2】:

    我认为 Pam 在 cmets 中提到了两个最佳修复。 您可以使用旋转标签 plt.xticks(旋转=45 更多信息,请看这里:Rotate axis text in python matplotlib

    真正的问题是没有提供任何额外信息的太多零。 Numpy 数组很容易使用,所以pd.DataFrame(np.array(raw_data)/1000).hist(bins=5) 应该去掉两个轴上的三个零。然后只需在轴标签中添加一个“公斤”。

    要更改图形的大小,请使用 rcParams。

    from matplotlib import rcParams rcParams['figure.figsize'] = 7, 5.75 #the numbers are the dimensions

    【讨论】:

    • @hey 谢谢..这种方法也有效...但是在新标签上,图像很小..有没有办法确保我在新标签中打开它,图像能以某种方式变大吗?