はじめに
pandasって便利ですよね
私は特にグラフの作成に使用しています。
様々なグラフを重ねて表示させるにはどうすればいいでしょうか。
元のデータ
今回用意したデータがこちらです。
そしてこれをグラフにしたものがこちらです。
aaa.plot(x="x",y = "ex10", xlim=[-2, 4], ylim=[0,0.01])
さらに、追加でこんなデータや、
bbb.plot.scatter(x="x",y = "ex1", xlim=[-2, 4], ylim=[0,0.01])
こんなデータを重ねて表示したいと思います。
最終的にはこんな感じで表示したいと思います。
これらをどうやってpandasで行うのか調べました。
方法1 mergeを使う(失敗)
pandasで異なるデータフレームを結合する際、mergeというものがあります。
ざっくり説明すると、これは共通変数があるときの結合方法で、共通変数内に同じ数値があればその行に追加し、なかったら一番下の行に追加するという関数です。
試しにやってみた結果が以下の通りです。
ccc = pd.DataFrame([0], columns=["x"])
for i in range(1,n+1):
label = "ex" + str(i)
bbb = pd.DataFrame(ex_line[i], columns=["x", label])
bbb.plot(x="x", xlim=[-L4, L1], ylim=[0,0.01])
#交点においてmerge時に順番が飛び、うまく書けない
ccc = pd.merge(ccc,bbb, on="x", how='outer')
折れ線が途切れてしまいました。
この原因は、同じ数値があればその行に追加することが原因でした。
つまり、on="x", how='outer'
と指定したことにより、x=0と-2が各列の共通の値なので、ここだけ順番が上になっているということでした。
この写真を見てもわかるように、各列において要素が存在する行が変数xが昇順になるように上から並んでいなければいけないのですが、x=0
だけ一番上まで連れてこられてしまっているため、順番がめちゃくちゃになってしまったのです。
方法2 appendで下の行にそのままつなげる(成功)
下の行にデータをつなげているだけなので順番が変わらずグラフが描けます。
ccc = pd.DataFrame([0], columns=["x"])
for i in range(1,n+1):
label = "ex" + str(i)
bbb = pd.DataFrame(ex_line[i], columns=["x", label])
bbb.plot(x="x", xlim=[-L4, L1], ylim=[0,0.01])
#下につなげるだけでうまくいく
ccc = ccc.append(bbb)
データフレームの中身はこのようになります。
方法3 plotの変数axを使う
pandasのplotはmatplotlibに準じたものなのですが、なかなかpandasのplotについて書かれた記事が出てこない。
いろいろ探した結果、以下のサイトが最高でした。
これによれば、plot内の変数ax
を使用することでグラフを重ねることができます。
これが一番簡単そうですね
まとめ
pandasで複数グラフを重ねる方法について考えました。
一つのデータフレームを使うなら方法2、グラフを重ねるなら方法3を使えば問題なさそうです。