python中的矩形线条图

时间:2017-07-12 16:27:56

标签: python python-2.7 matplotlib plot

我想在python中使用matplotlib创建一个带有矩形线的图,如下所示:

Rectangle line plot example

可悲的是,我不知道怎么称这种情节(我把它们合在一起,它有点像条形图但是旋转了90度),因此我的谷歌搜索是一个丢失的案例。我的数据集是这样的:

   y   x
  1.0 1.0
  0.6 2.3
  0.3 3.3
  0.1 1.4
 -0.4 2.1
 -0.6 3.8
 -0.8 0.9
 -1.0

我已将xy放入两个变量列表中。基本上,应在当前值和下一个x值之间绘制y值(比较图片和示例中的值)。

3 个答案:

答案 0 :(得分:2)

您应该尝试matplolib.path,请尝试以下代码

import matplotlib.path as mpath
import matplotlib.pyplot as plt
fig, ax = plt.subplots()

Path = mpath.Path
path_data = [
    (Path.MOVETO, (1.58, -2.57)),
    (Path.CURVE4, (0.35, -1.1)),
    (Path.CURVE4, (-1.75, 2.0)),
    (Path.CURVE4, (0.375, 2.0)),
    (Path.LINETO, (0.85, 1.15)),
    (Path.CURVE4, (2.2, 3.2)),
    (Path.CURVE4, (3, 0.05)),
    (Path.CURVE4, (2.0, -0.5)),
    (Path.CLOSEPOLY, (1.58, -2.57)),
    ]

codes, verts = zip(*path_data)
path = mpath.Path(verts, codes)

# plot control points and connecting lines
x, y = zip(*path.vertices)
line, = ax.plot(x, y, 'go-')

ax.grid()
ax.axis('equal')
plt.show()

您将基本了解路径的工作原理,然后修改顶点以绘制自己的图形。有关详细信息,请参阅以下链接: https://matplotlib.org/api/path_api.html#module-matplotlib.path

答案 1 :(得分:2)

您可以使用"steps-"线型进行策划,("steps-pre""steps-post""steps-mid")。这些确定坐标是否表示线的开始,中间和结尾。

step = plt.plot(y,x, linestyle="steps-pre")

一些完整的例子:

u = u"""y   x
  1.0 1.0
  0.6 2.3
  0.3 3.3
  0.1 1.4
 -0.4 2.1
 -0.6 3.8
 -0.8 0.9
 -1.0 0"""

import io
import matplotlib.pyplot as plt
import numpy as np

y,x = np.genfromtxt(io.StringIO(u),skip_header=1, unpack=True)

step = plt.plot(x,y, linestyle="steps-pre")

plt.show()

enter image description here

答案 2 :(得分:1)

如果您想使用plt.plot,还可以添加额外的顶点。所以而不是:

x = [1.0, 2.3, 3.3, 1.4, 2.1, 3.8, 0.9]
y = [1.0, 0.6, 0.3, 0.1, -0.4, -0.6, -0.8]

待办事项

new_x = [1.0, 1.0, 2.3, 2.3, 3.3, 3.3, 1.4, 1.4, 2.1, 2.1, 3.8, 3.8, 0.9]
new_y = [1.0, 0.6, 0.6, 0.3, 0.3, 0.1, 0.1, -0.4, -0.4, -0.6, -0.6, -0.8, -0.8]

给你:

import matplotlib.pyplot as plt
plt.plot(new_x, new_y)

Plot

当然,您可能会注意到我们只是重复x两次的值(删除了最后一个值)和y两次(删除了第一个值),这样一个简单的方法要使用纯Python将x转换为new_x,将y转换为new_y,请执行以下操作:

new_x = [a for a in x for _ in range(2)][:-1]
new_y = [a for a in y for _ in range(2)][1:]

使用itertoolsnp.repeat会更清晰。