Matplotlib步进函数:如何扩展第一步和最后一步

iaqfqrcu  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(170)

我在Matplotlib中使用stepfill_between函数,希望步骤以x点为中心。

代码

import matplotlib.pyplot as plt
import numpy as np

xpoints=np.array([1,2,3,4])
ypoints=np.array([4,6,5,2])
ypoints_std=np.array([0.5,0.3,0.4,0.2])
plt.step(xpoints,ypoints,where='mid')
plt.fill_between(xpoints,ypoints+ypoints_std,ypoints-ypoints_std,step='mid',alpha=0.2)
plt.show()

当前绘图:

此时,以1为中心的台阶仅为0.5宽,而以2为中心的台阶为1宽。

通缉

实际上我希望所有的步和填充的步宽都是1。这应该包括第一步和最后一步,这样它们相对于当前的图是扩展的。

当然,我可以填充数据,但在实际代码中这会变得很混乱。

问题

1.有没有办法让第一步和最后一步的大小和中间的一样?
1.或者有没有一种方法可以使用直方图生成类似的图形?即显示以图形的y位置为中心的条的全宽大小的误差?

vhmi4jdf

vhmi4jdf1#

使用某一高度的条形图

误差带可通过底部为ypoints - ypoints_std、高度为2*ypoints_std的条形图显示。

import matplotlib.pyplot as plt
import numpy as np

xpoints = np.array([1, 2, 3, 4])
ypoints = np.array([4, 6, 5, 2])
ypoints_std = np.array([0.5, 0.3, 0.4, 0.2])

plt.bar(xpoints, ypoints, width=1, facecolor='none', edgecolor='dodgerblue')
plt.bar(xpoints, height=2 * ypoints_std, bottom=ypoints - ypoints_std, width=1, color='dodgerblue', alpha=0.2)

plt.xticks(xpoints)
plt.show()

使用零高度条形图

如果只有水平线,可以用零高度的条形图替换第一个条形图。添加相同颜色的原始plt.step将创建连接线

plt.gca().use_sticky_edges = False # prevent bars from "sticking" to the bottom
plt.step(xpoints, ypoints, where='mid', color='dodgerblue')
plt.bar(xpoints, height=0, bottom=ypoints, width=1, facecolor='none', edgecolor='dodgerblue')
plt.bar(xpoints, height=2 * ypoints_std, bottom=ypoints - ypoints_std, width=1, color='dodgerblue', alpha=0.2)

扩展点

您可以添加虚拟值来重复第一个点和最后一个点,然后使用plt.xlim(...)将绘图限制在0.54.5之间。

import matplotlib.pyplot as plt
import numpy as np

xpoints = np.array([1, 2, 3, 4])
ypoints = np.array([4, 6, 5, 2])
ypoints_std = np.array([0.5, 0.3, 0.4, 0.2])

xpoints = np.concatenate([[xpoints[0] - 1], xpoints, [xpoints[-1] + 1]])
ypoints = np.pad(ypoints, 1, mode='edge')
ypoints_std = np.pad(ypoints_std, 1, mode='edge')

plt.step(xpoints, ypoints, where='mid')
plt.fill_between(xpoints, ypoints + ypoints_std, ypoints - ypoints_std, step='mid', alpha=0.2)
plt.xlim(xpoints[0] + 0.5, xpoints[-1] - 0.5)
plt.show()

oug3syen

oug3syen2#

您可以使用pyplot.margins(0),至少让您的图形在所有4个侧面(左/右和底/顶)上接触轴。
对x和y使用两个位置参数,或者使用一个位置参数同时应用于这两个位置参数:

import matplotlib.pyplot as plt
import numpy as np

xpoints=np.array([1,2,3,4])
ypoints=np.array([4,6,5,2])
ypoints_std=np.array([0.5,0.3,0.4,0.2])

fig, ax = plt.subplots()

ax.step(xpoints,ypoints,where='mid')
ax.fill_between(xpoints,ypoints+ypoints_std,ypoints-ypoints_std,step='mid',alpha=0.2)
ax.margins(0)  # default margins are 0.5 for x-axis and y-axis

plt.show()

输出:

相关问题