Matplotlib:如何定位刻度并显示数据的最小值和最大值

时间:2017-10-30 09:38:32

标签: python matplotlib

美好的一天,

我想动态定位我的刻度并显示数据的最小值和最大值(这是变化的,因此我真的无法对条件进行编码)。我尝试使用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()

,输出为:

Matplotlib ticks and data limits

1 个答案:

答案 0 :(得分:0)

不确定最佳方法,但一种可能的方法是使用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()

这给出了:

enter image description here

更新:这会给出最大个刻度数为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]))

这产生了下图:

enter image description here