2017-03-29 20 views
1

これはいくつかの出版された論文で使用されている典型的なエネルギーランキングです。私はPython(matplotlib、snsなど)を使用して自分のデータを再現するのに苦労しています。Pythonを使用してエネルギー順位の数値をプロットするにはどうすればよいですか?

System Color_id Data1 Data2 
Form I  1  0.0 0.6 
Form II 2  0.8 0.0 
Form III 3  2.1 2.7 
Form IV 4  2.2 0.3 
Form V  5  1.7 1.2 

私はmatplotlibののように着色specific_column_valuesを有効にするには、「COLOR_ID」欄を追加し、私は単にplt.scatter用いたハーフウェイ午前思う:私は私のデータは、以下のようなパンダのデータフレームで構築しました。私が苦労しているのは、典型的なマーカーの代わりに細長い線をプロットし、同様のシステム間でこれらの破線を異なるデータ間で自動的に接続する方法です。どんな助けや提案も大歓迎です。

Energy Ranking Plots

+0

多分それはそれに役立つ:http://stackoverflow.com/questions/20130227/matplotlib-connect-scatterplot-points-with-line-python – Dadep

+0

マーカーがレンダリングされたUnicode文字なので、かなりの選択がありますが、彼らは簡単に変更することはできません。とにかく2点を必要とするので、実線と点線のラインアーティストを別々に生成するヘルパー関数を作成することをお勧めします – Aaron

答えて

2

私はコメントで提案内容の例を実装しました。これは自動的に軸をスケールしません(私はそれをハードコード化しました)、または目盛りのラベルを追加しますが、それはあなたが他の質問で見つけることができるすべてのものです。

import matplotlib.pyplot as plt 
import numpy as np 

def energy_rank(data, marker_width=.5, color='blue'): 
    y_data = np.repeat(data, 2) 
    x_data = np.empty_like(y_data) 
    x_data[0::2] = np.arange(1, len(data)+1) - (marker_width/2) 
    x_data[1::2] = np.arange(1, len(data)+1) + (marker_width/2) 
    lines = [] 
    lines.append(plt.Line2D(x_data, y_data, lw=1, linestyle='dashed', color=color)) 
    for x in range(0,len(data)*2, 2): 
     lines.append(plt.Line2D(x_data[x:x+2], y_data[x:x+2], lw=2, linestyle='solid', color=color)) 
    return lines 

data = np.random.rand(4,8) * 4 # 4 lines with 8 datapoints from 0 - 4 

artists = [] 
for row, color in zip(data, ('red','blue','green','magenta')): 
    artists.extend(energy_rank(row, color=color)) 

fig, ax = plt.subplots() 

for artist in artists: 
    ax.add_artist(artist) 
ax.set_ybound([0,4]) 
ax.set_xbound([.5,8.5]) 
+0

あなたの入力に感謝します。 @Aaron:あなたの実装は素晴らしかったです。どうもありがとう。 –