使用CSV文件的Matplotlib多线图

时间:2019-07-01 20:13:31

标签: python python-3.x pandas matplotlib mcmc

我创建了自己的MCMC仿射不变算法,该算法使用两个维度(斜率和y截距)以及4个助步器。我将所有数据保存在一个csv文件中,其中有两列m和b,然后对于四行中的每一行,它都代表第一个行者。因此,例如,在下面的csv文件中,第一个walker表示在第0、4、8和12行,而第二个walker表示在第1、5、9和13行,依此类推。如下所示:

chain.csv

我想创建一个看起来像意大利面条或进化图https://python-graph-gallery.com/124-spaghetti-plot/的图,其中每个助行器都用自己的线表示,而不是将m和b的整个列都用自己的线表示。到目前为止,我有一个功能,可将行者按行和列按数据帧分开,但是我很难将这些值绘制为多行。

def make_evo_plot(df):
   w1m = df['m'][0::4] #walker1 m
   w1b = df['b'][0::4] #walker1 b
   w2m = df['m'][1::4] #walker2 m
   w2b = df['b'][1::4] #walker2 b
   w3m = df['m'][2::4] #walker3 m
   w3b = df['b'][2::4] #walker3 b
   w4m = df['m'][3::4] #walker4 m
   w4b = df['b'][3::4] #walker4 b
   fig,ax = plt.subplots()
   plt.plot(w1m)
   plt.plot(w2m)
   plt.plot(w3m)
   plt.plot(w4m)
   ax.plot(w1b,w2b,w3b,w4b)
   plt.show()

从这段代码中,我的情节看起来像这样: bad plot

非常感谢您提供绘制数据的帮助!!

更新: 我尝试执行以下代码,但得到ValueError: x and y must have same first dimension, but have shapes (0,) and (8750,)

def make_evo_plot(df):
  w1m = df['m'][0::4] #walker1 m
  w1b = df['b'][0::4] #walker1 b
  w2m = df['m'][1::4] #walker2 m
  w2b = df['b'][1::4] #walker2 b
  w3m = df['m'][2::4] #walker3 m
  w3b = df['b'][2::4] #walker3 b
  w4m = df['m'][3::4] #walker4 m
  w4b = df['b'][3::4] #walker4 b
  fig,ax = plt.subplots()
  plt.plot(w1m)
  plt.plot(w2m)
  plt.plot(w3m)
  plt.plot(w4m)
  ax.plot(w1b,w2b,w3b,w4b)
  plt.show()

1 个答案:

答案 0 :(得分:2)

要绘制斜率/截距的演变,只需为轴定义一个序列,例如x=np.arange(0,100,5),然后使用ax.plot(x, w1m)

def make_evo_plot(df):
   w1m = df['m'][0::4] #walker1 m
   w1b = df['b'][0::4] #walker1 b
   w2m = df['m'][1::4] #walker2 m
   w2b = df['b'][1::4] #walker2 b
   w3m = df['m'][2::4] #walker3 m
   w3b = df['b'][2::4] #walker3 b
   w4m = df['m'][3::4] #walker4 m
   w4b = df['b'][3::4] #walker4 b

   x = np.arange(0,2500,5) #Define a sequence of same length as your data

   fig,ax = plt.subplots()

   #To plot the evolution of the 4 slopes
   ax.plot(x,w1m)
   ax.plot(x,w2m)
   ax.plot(x,w3m)
   ax.plot(x,w4m)

   plt.show()