如何绘制来自几个不同类别的多个度量?

时间:2018-09-09 18:39:22

标签: pandas matplotlib plot seaborn

对于使用哪种程序包来绘制我的数据,我有些困惑,该程序通常由10个不同的类别(例如温度)组成,每个类别有3或4个并行测量值。在这里,我尝试仅使用熊猫(Trial1 + 2)和seaborn(Trial3)。

最后,我想要的是一个散点图,显示每个类别的三个度量,并另外绘制一条通过我所有数据的平均线(请参见下面的示例A和B)。

我知道我可以将数据放在CSV文件中,可以使用jupyter笔记本中的PANDAS包导入。 然后我解决了问题;我认为现在可能与索引或数据类型有关?我收到很多错误,即x必须等于y,或者未定义索引“ Degrees” ...下面将展示最成功的试验。

到目前为止,我已经使用此组成的数据集“ Dummydata”尝试了几种方法,该数据集非常能代表我将要处理的真实数据的类型。

我的测试CSV文件:

它是一个具有四列的.CSV文件,其中第一列是温度,然后接下来的三列是对应温度(y1,y2,y3)的第一,第二和第三测量值。

in[]: Dummydata.to_dict()
Out[]:
    {'Degrees': {0: 0,
      1: 10,
      2: 20,
      3: 30,
      4: 40,
      5: 50,
      6: 60,
      7: 70,
      8: 80,
      9: 90},
     'y1': {0: 20, 1: 25, 2: 34, 3: 35, 4: 45, 5: 70, 6: 46, 7: 20, 8: 10, 9: 15},
     'y2': {0: 20, 1: 24, 2: 32, 3: 36, 4: 41, 5: 77, 6: 48, 7: 23, 8: 19, 9: 16},
     'y3': {0: 18, 1: 26, 2: 36, 3: 37, 4: 42, 5: 75, 6: 46, 7: 21, 8: 15, 9: 16}}

试验1:尝试实现散点图

import pandas as pd
import matplotlib.pyplot as plt

Dummydata = pd.read_csv('DummyData.csv','r',delimiter=(';'), header=0)

y = ['y1','y2','y3']
x = ['Degrees']

Dummydata.plot(x,y)

这将提供漂亮的线条图,但也会产生UserWarning:Pandas不允许通过新的属性名称(??)创建列。 如果将图更改为Dummydata.plot.scatter(x,y),则会出现错误:x和y的大小必须相同...因此我知道我的数据形状为(10,4),因为10行4列,如何重新定义它对熊猫没问题?

试用2:对同一事物进行细微调整

import pandas as pd
import matplotlib.pyplot as plt

#import the .csv file, and set deliminator to ; and set the header as the first line(0)
Dummydata = pd.read_csv('DummyData.csv','r',delimiter=(';'), header = 0)
x =('Degrees')
y1 =('y1')
y2 =('y2')
y3 =('y3')


Dummydata.plot([x,y3])                       #works fine for one value, but prints y1 and y2 ?? why?
    Dummydata.plot([x,y1])                       # also works, but print out y2 and y3 ??? why?                       # also works but prints out y2 and y3 ?? why?
    Dummydata.plot([x,y])                   # get error all arrays must be same length?
Dummydata.plot.scatter([x,y])                   # many error, no plot

我必须以某种方式告诉熊猫,数据形状(10,4)可以吗?不知道我在这里做错了什么。

试用3:使用seaborn并尝试获取散点图

我只是开始制作一个Factorplot,在这里我再次遇到同样的问题,即能够在我的图形上获得多个y值。我不认为如果我只知道如何在一个图形上添加更多数据,就很难将其转换为散点图。

import seaborn as sns
import matplotlib.pyplot as plt

#import the .csv file using pandas
Dummydata = pd.read_csv('DummyData.csv', 'r', delimiter=(';'))

#Checking what the file looks like
#Dummydata.head(2)

x =('Degrees')
y1 =('y1')
y2 =('y2')
y3 =('y3')
y =(['y1','y2','y3'])

Factorplot =sns.factorplot(x='Degrees',y='y1',data=Dummydata)

因子图对于一个数据集工作正常,但是,在绘制之前或在图中尝试添加更多y值(定义y =(['y1','y2','y3'])时,出现类似:无法解释输入“ y”。例如,此输入:

Factorplot =sns.factorplot(x='Degrees',y='y',data=Dummydata)

    Factorplot =sns.factorplot(x='Degrees',y=(['y1','y2','y3']),data=Dummydata) 
#Error: cannot copy sequence with size 3 to array axis with dimension 10

我想要实现的目标是这样的:在(A)中,我想要一个具有滚动平均值的散点图-在(B)中,我想绘制平均值不仅显示每个类别,还显示标准差,并另外在每个类别上绘制滚动平均值,如下所示:

enter image description here

我不想手动写入数据值,我想导入然后使用.csv文件(因为数据集可能变得非常大)。

组织csv文件的方式有问题吗?

感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

使用rolling计算滚动统计信息。用meanstd计算均值和标准差。用plot绘制数据。使用yerr关键字参数添加y误差线。

data = data.set_index('Degrees').rolling(window=6).mean()
mean = data.mean(axis='columns')
std = data.std(axis='columns')

ax = mean.plot()
data.plot(style='o', ax=ax)

enter image description here

plt.figure()
mean.plot(yerr=std, capsize=3)

enter image description here