3

我正在尝试使用 Matplotlib 绘制 Pandas 数据框。数据框包含四个由自然数组成的数据列和一个整数索引。我想为四列中的每一列生成一个带有折线图的图,以及每个点的误差线。此外,我想制作一个图例,为四个图形线中的每一个提供标签。

绘制没有误差线的线条和图例效果很好。然而,当我引入误差线时,图例变得无效——它使用的颜色不再对应于适当的线条。如果您比较带有误差线的图表和不带误差线的图表,则图例和曲线的形状/位置保持完全相同。然而,曲线的颜色会切换,因此尽管使用了相同的四种颜色,但它们现在对应于不同的曲线,这意味着图例现在为每条曲线分配了错误的标签。

因此,我的图形代码是:

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”。它将在您的工作目录中生成两个 PNG 文件——一个带有错误栏的图形,一个没有。

因此,这些图表是:

  • 正确的图表(没有误差线):
  • 不正确的图表(带有误差线):

观察没有误差线的图形是否被正确标记;请注意,带有错误条的图形标记不正确,就好像图例相同,折线图的颜色变化意味着每个图例条目现在指的是不同的(错误的)曲线。

感谢您的任何帮助,您可以提供。我花了好几个小时把我的头撞在墙上,我怀疑我犯了一个愚蠢的初学者的错误。对于它的价值,我已经尝试使用 Matplotlib 开发树,版本 1.2.0 和 1.1.0,并且所有三个都表现出相同的行为。

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 回答