【问题标题】:Matplotlib not showing correct and desired x-axisMatplotlib 未显示正确和所需的 x 轴
【发布时间】:2021-01-21 14:40:11
【问题描述】:

我有一个条形图,我试图在 x 轴刻度不重叠的情况下进行绘制。我已经确定了 45 度的角度,并且最大。 50 的刻度数,因为这大约是最大值。可以在不重叠的情况下显示的内容(如果刻度倾斜 45 度)。

但是,在我的尝试中,我遇到了 Matplotlib 的问题,无论我尝试什么,都没有将 x 轴设置为我想要的。我需要绘制多个数据集,所有这些数据集的时间从 -15.8 到 1200-1800 左右。

我尝试了几种我在网上找到的解决方案,但都无济于事。下面的代码不起作用,因为它没有显示正确的刻度。该范围在timepoints 列表中的最后一个数字之前停止。

import numpy as np
from matplotlib import pyplot as plt

# Mock data
timepoints = list(np.arange(-15.8, 1276.2, 4))
patient_counts = np.random.randint(300, 600, len(timepoints))
x_tick_pos = [i + 0.5 for i in range(len(timepoints))]

# Plot barplot
fig, ax = plt.subplots(figsize=(16, 10))
ax.bar(x_tick_pos, patient_counts, align='center', width=1.0)

# Set x axis ticks
ax.set_xticklabels(timepoints, rotation=45)
ax.locator_params(axis='x', nbins=20)

plt.show()

显然,x 轴没有接近预期值。

编辑
为了扩展,这个问题是this thread 的后续问题。基于该问题答案的代码如下

# Plot barplot
fig, ax = plt.subplots(figsize=(16, 10))
ax.bar(x_tick_pos, patient_counts, align='center', width=1.0)

# Set x axis ticks
ax.set_xticks(x_tick_pos)
ax.set_xticklabels(x_ticks, rotation=45)

这似乎设置了正确的 x-ticks,除了它们重叠很多 - 因此我只希望最多显示 50 个刻度:

【问题讨论】:

  • 去掉ax.set_xticklabels(timepoints, rotation=45)会得到i.stack.imgur.com/beM78.png,看起来很清晰。
  • 如果你想要超过 50 个刻度并且你不想让字体变小那么我想你需要把数字变大吗?但是你真的想要超过 50 个刻度标签吗?
  • @BigBen 感谢您的回复。我使用的真实数据具有从 -15.8 到 1276.2 的 X 值。如果我按照你的建议去做,我最终会得到一个从 0 到 340 的 x 轴,这自然没有多大意义。我将尝试编辑我的帖子以更准确地显示问题

标签: python matplotlib subplot


【解决方案1】:

这可能是修复x_tick_pos 列表表达式的简单案例。在您的模拟示例中,如果我们将它们打印出来......

x_tick_pos = [i + 0.5 for i in range(len(timepoints))]
print(x_tick_pos[:5], x_tick_pos[-5:])

...我们得到你的数字所反映的内容:

[0.5, 1.5, 2.5, 3.5, 4.5] [318.5, 319.5, 320.5, 321.5, 322.5]

将分配更改为

x_tick_pos = [i + 0.5 for i timepoints]

似乎会给出预期的滴答声。

【讨论】:

  • 嗨,汉斯,我刚刚意识到这一点,并对我的帖子进行了编辑,以反映为什么刻度位置是这样的。将位置设置为其他值会导致其他问题。
【解决方案2】:

问题在于,刻度的位置是这样写的,以便它们与该图表上方的另一个图表对齐,根据this post

有两种解决方案:

  1. 忘记相对于另一个图表定位刻度,以防此条形图以独立方式绘制
  2. 在绘制条形图后重新设置刻度,为它们提供正确的标签:
# Plot barplot
fig, ax = plt.subplots(figsize=(16, 10))
ax.bar(x_tick_pos, patient_counts, align='center', width=1.0)

# Set x axis ticks
ticks_step = int(len(missings_df.index) / 50)  # 50 here is the max. nr of ticks
x_ticks = [missings_df.index[i] for i in range(0, len(missings_df.index), int(len(missings_df)/50))]
x_tick_pos = [i + 0.5 for i in range(0, len(missings_df.index), int(len(missings_df)/50))]
ax.set_xticks(x_tick_pos)
ax.set_xticklabels(x_ticks, rotation=45)

这正确地绘制了 x 轴:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多