美好的一天,
我想动态定位我的刻度并显示数据的最小值和最大值(这是变化的,因此我真的无法对条件进行编码)。我尝试使用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()
,输出为:
答案 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()
这给出了:
更新:这会给出最大个刻度数为5的数字,但是如果数据来自range(3)
,那么刻度数将会减少。我更新了int_ticks1
和int_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]))
这产生了下图: