绘制可变轴刻度线

时间:2019-12-04 15:43:38

标签: python python-3.x matplotlib plot

您好,尝试根据计算的最小值和最大值使变量y(或x)轴刻度线。这是我到目前为止尝试过的:

ymin = (round((min(ECG_Data)), 1))
ymax = (round((max(ECG_Data)), 1))
..
plt.ylim(ymin - 0.05, ymax + 0.05)
plt.yticks(np.arange(ymin - 0.1, ymax + 0.2, step = 0.1))

示例1

enter image description here

最低值约为-0.38,最低刻度为-0.4,这很好。但是最高值在0.9以上,并且刻度线停在0.9,这是我不希望的。

示例2:

enter image description here

完美的示例,但是正如您在上面的代码中看到的那样,我在ylim&yticks中使用了硬编码-和+值,仅适用于该特定图形。

(如果我不在plt.yticks中使用数字值,则上下刻度都丢失了,例如缺少最高刻度的示例1)

如何制作带有可变刻度的可变轴?每次使用最小值和最大值来确定最低和最高刻度。

感谢您与我一起思考/帮助我!

2 个答案:

答案 0 :(得分:0)

这是因为np.arange是半开放时间间隔。因此,它不包含您想要的ymax。如果您想关闭间隔,可以尝试

np.linspace(start = ymin, stop = ymax, num = (ymax - ymin)/0.1)

答案 1 :(得分:0)

一种使这种方式更具动态性的方法可以是根据数据的最小值和最大值计算yrange,然后根据该值得出yticks。例如

from math import floor, ceil
import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(100,)*1.5 - 0.4 # generate some toy data

add_percent = 10
round_to_decimal = 1 # n decimal places, e.g. 2 would mean round to 2nd dec place

ymax, ymin = data.max(), data.min()
offset = (abs(ymin)+abs(ymax))/2 * add_percent/100
yrange = (floor((ymin - offset)*10**round_to_decimal)/10**round_to_decimal, 
          ceil((ymax + offset)*10**round_to_decimal)/10**round_to_decimal)

STEP = 0.1 # step=.1 is a bit arbitrary, depends on your data
yticks = np.arange(yrange[0], yrange[1]+STEP, step=STEP) 
# same as: np.linspace(*yrange, num=np.ptp(yrange)/STEP+1)

fig, ax1 = plt.subplots()
ax1.plot(data)
ax1.set_ylim(yrange)
ax1.set_yticks(yticks)

请注意,我添加了一个小数点后的舍入并添加了一个相对量的yrange,以使它看起来更好。结果看起来像这样: enter image description here