首页 > 解决方案 > 如何绘制来自多个不同类别的多个测量值?

问题描述

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

最后,我想要的是一个散点图,显示每个类别的三个测量值,并在我的所有数据中画一条平均线(参见下图中的示例 A 和 B)。

我知道我可以将我的数据放在一个 CSV 文件中,我可以使用 jupyter notebook 中的 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

不知何故,我必须告诉 pandas 数据形状 (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)中,我想仅绘制每个类别的平均值,但也显示标准偏差,并额外绘制每个类别的滚动平均值,如下所示:

在此处输入图像描述

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

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

所有帮助表示赞赏。

标签: pandasmatplotlibplotseaborn

解决方案


用 计算滚动统计rollingmean用和计算均值和标准差std。用 绘制数据plotyerr使用关键字参数添加 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)

在此处输入图像描述

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

在此处输入图像描述


推荐阅读