【问题标题】:Matplotlib: how to locate ticks and showing min and max of dataMatplotlib:如何定位刻度并显示数据的最小值和最大值
【发布时间】:2017-10-30 09:38:31
【问题描述】:

早安,

我想动态定位我的刻度并显示数据的最小值和最大值(这是变化的,因此我真的无法对条件进行编码)。我正在尝试使用 matplotlib.ticker 函数,我能找到的最好的函数是 MaxNLocator().. 但不幸的是,它没有考虑我的数据集的限制。

解决我的问题的最佳方法是什么?

谢谢!

伪代码如下:

import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator


data1 = range(5)
ax1 = plt.subplot(2,1,1)
ax1.plot(data1)

data2 = range(63)
ax2 = plt.subplot(2,1,2)
ax2.plot(data2)

ax1.xaxis.set_major_locator(MaxNLocator(integer=True))
ax2.xaxis.set_major_locator(MaxNLocator(integer=True))

plt.show()

输出是:

【问题讨论】:

  • plt.xlim( (xmin, xmax) )
  • @Silencer 我认为这不是 OP 所要求的。我认为他们希望刻度从 0 到 63(在这种情况下),但在示例中刻度从 0 到 64。更改此示例中的限制不会更改刻度位置
  • 不,它只是删除了侧面的尾随刻度,但仍然不反映刻度的限制。谢谢你。
  • 我不理解反对票。如果您有疑虑,请解决它而不是单击反对票。让我们有建设性:/

标签: python matplotlib


【解决方案1】:

不确定最佳 方法,但一种可能的方法是使用numpy.linspace(start, stop, num) 创建一个介于最小值和最大值之间的数字列表。传递给它的第三个参数允许您控制生成的点数。然后,您可以使用列表推导对这些数字进行四舍五入,然后使用 ax.set_xticks() 设置刻度。

注意:这会在某些情况下产生不均匀分布的刻度,这在您的情况下可能是不可避免的

import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
import numpy as np

data1 = range(5)
ax1 = plt.subplot(2,1,1)
ax1.plot(data1)

data2 = range(63)  # max of this is 62, not 63 as in the question
ax2 = plt.subplot(2,1,2)
ax2.plot(data2)

ticks1 = np.linspace(min(data1),max(data1),5)
ticks2 = np.linspace(min(data2),max(data2),5)

int_ticks1 = [round(i) for i in ticks1]
int_ticks2 = [round(i) for i in ticks2]

ax1.set_xticks(int_ticks1)
ax2.set_xticks(int_ticks2)

plt.show()

这给出了:

更新:这将给出 最大 5 个刻度,但是如果数据来自 range(3),那么刻度数将会更少。我已经更新了 int_ticks1int_ticks2 的创建,这样如果范围很小,将只使用唯一值来避免重复绘制某些刻度

使用以下数据

data1 = range(3)
data2 = range(3063)

# below removes any duplicate ticks
int_ticks1 = list(set([int(round(i)) for i in ticks1]))
int_ticks2 = list(set([int(round(i)) for i in ticks2]))

这会产生下图:

【讨论】:

  • 嗨!感谢您的回答,但我真的无法硬编码条件(数据 1 为 5 个刻度,数据 2 为 10 个刻度),因为数据确实在变化。绘图包含在一个函数中,因此每个数据都使用相同的绘图函数。
  • 那么你想要一个恒定数量的滴答声吗?
  • 不,数据有时只小于5,但有时也大于50。所以tick的数量不可能是恒定的。
  • @c4mm11 例如,将 5 放入 np.linspace 会创建最多 5 个刻度。如果您的数据范围很小,那么它将创建少于 5 个(假设删除了重复的刻度)。我已经更新了我的答案,添加了一些内容。
  • 哦,我忘了set。该解决方案有效,但会产生不均匀的滴答声。可悲的是,视觉在我的输出中非常重要。我真的很感谢你的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2021-01-27
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多