web-dev-qa-db-ja.com

Pythonパンダ、複数行のプロットオプション

pandasデータフレームから複数の行をプロットし、各行に異なるオプションを設定したい。次のようなことをしたい

_testdataframe=pd.DataFrame(np.arange(12).reshape(4,3))
testdataframe.plot(style=['s-','o-','^-'],color=['b','r','y'],linewidth=[2,1,1])
_

これにより、いくつかのエラーメッセージが表示されます。

  • リストで線幅を呼び出すことはできません

  • スタイルでは、リストで色を定義するときに「s」や「o」などのアルファベット記号を使用できません

また、私には奇妙なように見えるものがいくつかあります

  • 上記のコードtestdataframe[0].plot()に別のプロットコマンドを追加すると、同じプロットにこの行がプロットされます。コマンドtestdataframe[[0,1]].plot()を追加すると、新しいプロットが作成されます

  • testdataframe[0].plot(style=['s-','o-','^-'],color=['b','r','y'])を呼び出す場合、スタイルのリストで問題ありませんが、色のリストでは問題ありません

誰かが助けてくれることを願っています、ありがとう。

30
Joerg

あなたはとても近いです!

スタイルリストで色を指定できます。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

testdataframe = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C'])
styles = ['bs-','ro-','y^-']
linewidths = [2, 1, 4]
fig, ax = plt.subplots()
for col, style, lw in Zip(testdataframe.columns, styles, linewidths):
    testdataframe[col].plot(style=style, lw=lw, ax=ax)

また、plotメソッドはmatplotlib.axesオブジェクト、このように複数の呼び出しを行うことができます(必要に応じて):

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

testdataframe1 = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C'])
testdataframe2 = pd.DataFrame(np.random.normal(size=(4,3)), columns=['D', 'E', 'F'])
styles1 = ['bs-','ro-','y^-']
styles2 = ['rs-','go-','b^-']
fig, ax = plt.subplots()
testdataframe1.plot(style=styles1, ax=ax)
testdataframe2.plot(style=styles2, ax=ax)

この場合、実際には実用的ではありませんが、この概念は後で役立つ可能性があります。

48
Paul H

データフレームを考慮するtestdataframe

testdataframe = pd.DataFrame(np.arange(12).reshape(4,3))

print(testdataframe)

   0   1   2
0  0   1   2
1  3   4   5
2  6   7   8
3  9  10  11

以下で定義するstylesのように、stylesを組み合わせて文字列の単一のリストにすることができます。 lwsの線幅も定義します

styles=['bs-', 'ro-', 'y^-']
lws = [2, 1, 1]

リストplottestdataframeパラメーターに渡すstylesstyleメソッドを使用できます。辞書を渡すこともできたかもしれないことに注意してください(おそらく他のものも同様に)。

ただし、線幅は簡単に処理できません。最初にAxesSubplotオブジェクトをキャプチャし、行の幅を設定してlines属性を反復処理します。

ax = testdataframe.plot(style=styles)
for i, l in enumerate(ax.lines):
    plt.setp(l, linewidth=lws[i])

enter image description here

13
piRSquared

だから、答えは同じ引数で色とスタイルを渡すことにあると思います。次の例は、pandas 0.19.2で動作します。

testdataframe=pd.DataFrame(np.arange(12).reshape(4,3))
testdataframe.plot(style=['r*-','bo-','y^-'], linewidth=2.0)

残念ながら、複数の線幅をmatplotlibへの入力として渡すことはできないようです。

11
RexFuzzle