LoginSignup
0
0

More than 1 year has passed since last update.

pandasのデータフレームを結合するときにグラフをプロットすることを前提だとどうすればいいか

Last updated at Posted at 2022-01-14

はじめに

pandasって便利ですよね
私は特にグラフの作成に使用しています。
様々なグラフを重ねて表示させるにはどうすればいいでしょうか。

元のデータ

今回用意したデータがこちらです。

image.png

そしてこれをグラフにしたものがこちらです。

aaa.plot(x="x",y = "ex10", xlim=[-2, 4], ylim=[0,0.01])

image.png

さらに、追加でこんなデータや、

bbb.plot.scatter(x="x",y = "ex1", xlim=[-2, 4], ylim=[0,0.01])

image.png

こんなデータを重ねて表示したいと思います。

image.png

image.png

最終的にはこんな感じで表示したいと思います。

image.png

これらをどうやって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')

image.png

折れ線が途切れてしまいました。
この原因は、同じ数値があればその行に追加することが原因でした。
つまり、on="x", how='outer'と指定したことにより、x=0と-2が各列の共通の値なので、ここだけ順番が上になっているということでした。
この写真を見てもわかるように、各列において要素が存在する行が変数xが昇順になるように上から並んでいなければいけないのですが、x=0
だけ一番上まで連れてこられてしまっているため、順番がめちゃくちゃになってしまったのです。

image.png

方法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)

image.png

データフレームの中身はこのようになります。

image.png

方法3 plotの変数axを使う

pandasのplotはmatplotlibに準じたものなのですが、なかなかpandasのplotについて書かれた記事が出てこない。
いろいろ探した結果、以下のサイトが最高でした。

これによれば、plot内の変数axを使用することでグラフを重ねることができます。
これが一番簡単そうですね

まとめ

pandasで複数グラフを重ねる方法について考えました。
一つのデータフレームを使うなら方法2、グラフを重ねるなら方法3を使えば問題なさそうです。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0