2013-12-18 9 views
11

matplotlibでいくつかの点をプロットすると、グラフを作成するときに奇妙な動作が発生しました。このグラフを生成するコードを次に示します。ここで 無作為のデータを持つMatplotlibグラフを交差する

import matplotlib.pyplot as plt 
desc_x =[4000,3000,2000,2500,2750,2250,2300,2400,2450,2350] 
rmse_desc = [.31703 , .31701, .31707, .31700, .31713, .31698, .31697, .31688, .31697, .31699] 

fig = plt.figure() 
ax = plt.subplot(111) 

fig.suptitle('title') 
plt.xlabel('x') 
plt.ylabel('y') 

ax.plot(desc_x, rmse_desc, 'b', label='desc') 
ax.legend() 
plt.show() 

は、あなたが言うことができるように、このグラフは、1が折れ線グラフで表示されません何かをラインと交差している

graph with lines

それが作成するグラフです。私はポイントを隔離し、線を描画していないとき、私はこの結果を得る:

graph without lines

あなたが言うことができるよう、ラインを交差することなく、これらの点を接続する方法があります。

なぜmatplotlibがこれを行うのですか?私は私のxcolumnをソートしないことでそれを修正することができると思うが、ソートすれば、x1からy1へのマッピングが失われます。

+0

ありますか? –

答えて

16

numpyのargsort機能を使用して注文を維持することができます。

Argsort "...指定された軸に沿ったインデックスデータと同じ形状のインデックスの配列をソート順に返します。"このため、これを使ってx座標とy座標を並べ替えることができます。ここではどのように行うのです:desc_x`と `` rmse_desc`間の任意の機能の関係は

import matplotlib.pyplot as plt 
import numpy as np 

desc_x =[4000,3000,2000,2500,2750,2250,2300,2400,2450,2350] 
rmse_desc = [.31703 , .31701, .31707, .31700, .31713, .31698, .31697, .31688, .31697, .31699] 

order = np.argsort(desc_x) 
xs = np.array(desc_x)[order] 
ys = np.array(rmse_desc)[order] 

fig = plt.figure() 
ax = plt.subplot(111) 

fig.suptitle('title') 
plt.xlabel('x') 
plt.ylabel('y') 

ax.plot(xs, ys, 'b', label='desc') 
ax.legend() 
plt.show() 

enter image description here

+0

よかった、ありがとう。私の推測は正しいですか?x値がソートされていないので、グラフが奇妙に見えましたか? – nook

+1

ああ、そうだね。 Matplotlibは、あなたが入力した順番で各ペアの間に線を描きます。 – YXD

+0

'xs、ys = zip(* sorted(zip(desc_x、rmse_desc)))') 'と似たようなこともできますが、私はnumpyの方が好きです – YXD

関連する問題