2017-07-12 77 views
0

我想就在与矩形线条的Python matplotlib阴谋喜欢这一个:矩形线条绘制在python

Rectangle line plot example

可悲的是,我不知道如何把这种情节的(我photoshoped这个一起,它有点像棒图但旋转了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值之间绘制(比较图片和示例中的值)。

+0

这看起来很像一个折线图给我... – asongtoruin

回答

2

您可以使用"steps-" linestyle进行绘图,("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

+0

啊linestyle步骤正是我所期待的。我需要用'x.append(x [-1])'修复数据,以摆脱-1处的行 –

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

+0

如何解读是正确的,我需要重写数据集进入这个路径代码?如果是的话,这对我并不有用,因为我有很多大小未知的数据集。我更多的是寻找一些能够使用真实情节功能的东西 –

+0

我以为你只是一次画出一些复杂的图形。在你需要多次重写x和y的情况下。@Jason的回答比我的好。 –

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值两次(删除最后一个值)和两次(w。)两次(y)第i个去除第一值),这样一种简单的方法来转换xnew_xynew_y与纯Python是:

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是更清洁。

+0

该解决方案很好地工作。只是一个奇怪的问题:“_”如何适合?我以前没有见过。 –

+0

Underscore实际上是一个有效的变量名称。通常,它用于一个不具有任何意义的变量,并且不会在以后使用。例如,如果我想循环3次,我可以在范围(2)内为'我做',但是可能我的代码从不使用'i',所以它可能比''范围更干净(2)'。另一个有用的例子是如果一个函数返回多个东西,我不关心它的返回值之一:'x,_ = returns_tuple_size_2'。在这种情况下,我可能会关心返回的第一件事,但不会返回第二件事,所以我将它的值赋给'_'。 – Jason