2017-07-12 7 views
0

にプロットし、このいずれかを好き:矩形ラインは、私は、矩形ラインとpythonでmatplotlibのでプロットを作成したいのpython

悲しいこと

Rectangle line plot example

私は、プロットのこの種の(I photoshopedを呼び出す方法見当がつかないこの1つは、一緒に、それはバープロットのようなものですが、90度回転)、したがって私のGoogle検索は失われたケースです。私のデータセットは、このようなものです:私はすでに2つの変数リストにxyを入れ

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 

。基本的には、xの値は、現在値と次の値の間に描画する必要があります(この例の画像と値を比較してください)。

+0

これは、私は、データセットを書き直す必要があると... – asongtoruin

答えて

2

プロットには"steps-"の線種を使用できます("steps-pre",、"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

ああ、私が探していたリネンスタイルのステップは、まさに私が探していたものでした。 -1で行を取り除くには、 'x.append(x [-1])'でデータを修正する必要がありました。 –

2

あなたは、パスがどのように動作するかの基本的な理解を取得し、独自のグラフをプロットするために、あなたの頂点を修正します次のコード

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() 

を試してみて、matplolib.pathを試してみてください。詳細は、 https://matplotlib.org/api/path_api.html#module-matplotlib.path

+0

は、私は右のそれを解釈してください、私には折れ線グラフによく似ていますこれのためのパスコードに?はいの場合、これは私にとっては有用ではありません。サイズが不明なデータセットが多数あるためです。私は実際のプロット関数を使う何かをもっと探していた –

+0

私はあなたが複雑なグラフを1回だけ描​​画すると思っていました。 xとyを何度も書き直さなければならない場合。@ジェイソンの答えは私より優れています。 –

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の値を繰り返していることに気づくかもしれません2回(最後の値を削除して)、yを2回(w除去最初の値)、ピュアPythonでxnew_yからnew_x及びyを変換するので、簡単な方法であるi番目:

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

それはitertools又はnp.repeatを使用してもクリーンであろう。

+0

その解決策はうまく機能します。ちょうど興味深い質問:「_」はどのようにフィットしますか?私は以前それを見たことがない。 –

+0

アンダースコアは実際には有効な変数名です。通常は、意味を持たない変数に使用され、後では使用されません。例えば、私が3回ループしようとしている場合、私は 'for i in range(2)'を行うことができますが、私のコードでは 'i'を使用しない可能性があるので、' for _ in range (2) '。もう1つの有用なケースは、関数が複数のものを返す場合で、戻り値の1つについて気にしない場合です: 'x、_ = returns_tuple_size_2'。この場合、返される最初のものが気になるかもしれませんが、2番目のものは返されませんので、値を '_'に代入します。 – Jason

関連する問題