Matplotlib 步骤图旋转

4

我想正确旋转matplotlib阶梯图。首先,我交换了x和y轴并翻转了y轴。然后我重新绘制了阶梯图。但是,在右边的图片中,步进线(蓝色)的方向不如所期望的那样,并且红色的阶梯线是左边图片的叠加旋转图像。以下是我的代码:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(14)
y = np.sin(x / 2)

fig, (ax, bx) = plt.subplots(nrows=1, ncols=2, figsize=(11.5, 5.5))
fig.subplots_adjust(left=0.08, bottom=0.13, top=0.98, right=0.97, wspace=0.2, hspace=0.0)

ax.step(x, y, where='mid', c='r')
ax.plot(x, y, 'o--', color='grey', alpha=0.3)

bx.invert_yaxis()
bx.step(y, x, where='pre', c='b')
bx.plot(y, x, 'o--', color='grey', alpha=0.3)

plt.show()

我想制作如右图所示的红色步进图。如何实现?

enter image description here

2个回答

3

通过稍微偏移第二个坐标并使用 where=pre,可以得到所需的步进样式。

def plot_step_invert_mid(x, y, *args, **kwargs):
    y_new = np.insert(y, 0, y[0])
    y_new = 0.5 * (y_new[1:] + y_new[:-1])
    x_new = np.append(x, x[-1])
    y_new = np.append(y_new, y[-1])
    plt.step(x_new, y_new, where="pre", *args, **kwargs)

fig, (ax, bx) = plt.subplots(nrows=1, ncols=2, figsize=(11.5, 5.5))
fig.subplots_adjust(left=0.08, bottom=0.13, top=0.98, right=0.97, wspace=0.2, hspace=0.0)

ax.step(x, y, where="mid", c='r')
ax.plot(x, y, 'o--', color='grey', alpha=0.3)

bx.invert_yaxis()
plot_step_invert_mid(y, x)
bx.plot(y, x, 'o--', color='grey', alpha=0.3)

results


1
很好的答案,我认为最好让数据不受影响。 - Matt Hall
2
一个小缺点在于 plot_step_invert_mid(y, x, "ro-") 将无法在所需位置显示标记。 - nonin
啊,好的,我明白你的意思了...这是一个棘手的问题。当然,你可以随时绘制数据本身。这将为matplotlib增添不错的功能。 - Matt Hall
1
这是一个很好的答案,没有使用外部包。非常感谢您定义了一个子程序。 - Bluerose
再次感谢@noin,对于步进图的“pre”和“post”选项应该进行哪些更改? - Bluerose
基本上交换两个选项!反转的“pre”是“post”,反之亦然。 - nonin

0

我建议您使用scipy.interpolate.interp1d对原始曲线进行插值,而不是使用matplotlib.pyplot.step方法进行绘图。这是因为interp1d会生成一个新的向量,您可以随意操纵它。
在下面的代码中:

  1. xy是原始曲线向量(长度为14)
  2. xxyy是原始曲线插值向量(长度为N

为了旋转图形,您只需在plt.plot中交换xy以及xxyy即可:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

x = np.arange(14)
y = np.sin(x/2)

N = 1000
xx = np.linspace(0, 13, N)
yy = interp1d(x, y, kind = 'nearest')(xx)

fig, (ax, bx) = plt.subplots(nrows = 1, ncols = 2, figsize = (11.5, 5.5))
fig.subplots_adjust(left = 0.08, bottom = 0.13, top = 0.98, right = 0.97, wspace = 0.2, hspace = 0.0)

ax.plot(xx, yy, 'r')
ax.plot(x, y, 'o--', color = 'grey', alpha = 0.3)

bx.invert_yaxis()
bx.plot(yy, xx, 'r')
bx.plot(y, x, 'o--', color = 'grey', alpha = 0.3)

plt.show()

enter image description here


我认为这个答案的原始版本更有趣,因为它将问题推广到了任何角度。 - nonin
谢谢,我认为你是对的,但在原始版本中y轴没有被反转,因此答案并未解决提问者的具体问题;我后来才注意到这一点。 - Zephyr
这是一个非常有趣的解决方案,但使用外部子程序并不理想,至少对我来说是这样。 - Bluerose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接