3

Matplotlib を使用して Pandas データフレームをグラフ化しようとしています。データフレームには、自然数で構成される 4 つのデータ列と、整数のインデックスが含まれています。4 つの列のそれぞれに折れ線グラフと、各ポイントの誤差範囲を含む 1 つのプロットを作成したいと思います。さらに、グラフ化された 4 本の線のそれぞれにラベルを付ける凡例を作成したいと思います。

エラーバーなしで線と凡例をグラフ化するとうまくいきます。ただし、エラー バーを導入すると、凡例が無効になります。使用する色が適切な線に対応しなくなります。エラーバーがあるグラフとないグラフを比較すると、凡例と曲線の形状/位置はまったく同じままです。ただし、曲線のが入れ替わるため、同じ 4 色が使用されていても、異なる曲線に対応するようになりました。つまり、凡例が各曲線に間違ったラベルを割り当てるようになりました。

したがって、私のグラフ作成コードは次のとおりです。

def plot_normalized(agged, show_errorbars, filename):
  combined = {}
  # "agged" is a dictionary containing Pandas dataframes. Each dataframe
  # contains both a CPS_norm_mean and CPS_norm_std column. By running the code
  # below, the single dataframe "combined" is created, which has integer
  # indices and a column for each of the four CPS_norm_mean columns contained
  # in agged's four dataframes.
  for k in agged:
    combined[k] = agged[k]['CPS_norm_mean']
  combined = pandas.DataFrame(combined)

  plt.figure()
  combined.plot()

  if show_errorbars:
    for k in agged:
      plt.errorbar(
        x=agged[k].index,
        y=agged[k]['CPS_norm_mean'],
        yerr=agged[k]['CPS_norm_std']
      )

  plt.xlabel('Time')
  plt.ylabel('CPS/Absorbency')
  plt.title('CPS/Absorbency vs. Time')
  plt.savefig(filename)

100 行の完全なスクリプトは、GitHub で入手できます。実行するには、graph.py と lux.csv の両方をダウンロードしてから、「python2 graph.py」を実行します。作業ディレクトリに 2 つの PNG ファイルが生成されます。1 つはエラー バー付きのグラフで、もう 1 つはエラー バーなしのグラフです。

したがって、グラフは次のとおりです。

  • 正しいグラフ (エラーバーなし):
  • 間違ったグラフ (エラーバー付き):

エラーバーのないグラフが適切にラベル付けされていることを確認してください。凡例が同一であるかのように、エラー バーを含むグラフのラベル付けが不適切であることに注意してください。折れ線グラフの色が変更されたことは、各凡例エントリが異なる (間違った) 曲線を参照していることを意味します。

ご協力いただきありがとうございます。私は何時間も頭を壁にぶつけて非常に腹立たしい時間を過ごしてきました。私はばかげた初心者の間違いを犯しているのではないかと疑っています。価値のあるものとして、Matplotlib 開発ツリー、バージョン 1.2.0、および 1.1.0 を試してみましたが、3 つすべてが同じ動作を示しました。

4

1 に答える 1

2

私はプログラミングとPython全般に不慣れですが、なんとか汚い修正をまとめました。凡例は正しくなりましたが、色は正しくありません。

def plot_normalized(agged, show_errorbars, filename):
  combined = {}
  for k in agged:
    combined[k] = agged[k]['CPS_norm_mean']
  combined = pandas.DataFrame(combined)

  ax=combined.plot()

  if show_errorbars:
    for k in agged:
      plt.errorbar(
        x=agged[k].index,
        y=agged[k]['CPS_norm_mean'],
        yerr=agged[k]['CPS_norm_std'],
        label = k #added
      )

  if show_errorbars: #try this, dirty fix
   labels, handles = ax.get_legend_handles_labels()
   N = len(handles)/2
   plt.legend(labels[:N], handles[N:])

  #Why does the fix work?:
  #labels, handles = ax.get_legend_handles_labels()
  #print handles
  #out:
  #[u'Blank', u'H9A', u'Q180K', u'Wildtype', 'Q180K', 'H9A', 'Wildtype', 'Blank']
  #Right half has correct order, these are the labels from label=k above in errorplot



  plt.xlabel('Time')
  plt.ylabel('CPS/Absorbency')
  plt.title('CPS/Absorbency vs. Time')
  plt.savefig(filename)

プロデュース: エラープロットなし エラー プロット

于 2012-11-26T00:14:59.930 に答える