在python中从dataframe自动生成图形

2024-03-28 18:01:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要自动生成大约320个单独的图形。我可以成功地为一个人绘制5-18张图表。总共大约有7500多行数据。每行代表一个反转位置。在

我需要先拉,然后再画出: 1参与者(19名参与者), 2波长(波长的数目因人而异,有的只有4个,有的多达20个), 三。递增或递减(正或负条件),以及 4实验编号(1-4)。在

下面的代码使用seaborn为一个参与者显示5张图,每5个波长一张图。我有大约20名参与者(数据中按姓名首字母顺序列出)。我想写一个脚本,基本上可以为每个人和每个条件生成几个图。在

我可以按1查询或排序数据。实验,2。人,3。条件(阈值pos或neg数字)和4。波长。我还不知道如何调用或存储这些数据来绘制图形。在

例如,如果我想手动填写每个人的首字母缩写、波长、Inc/Dec(阈值)和每个实验编号,则此代码有效:

#select the desired items out of the dataframe
df[(df.Per == 'AEM') & (df.WL == 488) & (df.IncDec == 1) & (df.ExpNum == 4)]

或者这样可以排序,但我不知道如何使用它来生成每个人的图表。在

^{pr2}$

我还尝试为我需要调用的每个字段编写字典,但也不知道如何在循环中使用它来调用每个项。这是一个示例,显示了我的数据帧中波长值的独特实例:

>>> dfsWL_key_names
dict_keys([428, 440, 452, 464, 476, 488, 500, 512, 524, 536, 548, 560, 572, 584, 596, 608, 620, 632, 644, 656, 668, 680])

每个图可能需要显示不同数量的数据点,例如1-??逆转。大多数情况下,反转数为12(图中为12个点),但在某些情况下,可绘制的反转位置较少,最多可绘制15个正反转位置和15个负反转位置。在每种情况下,每个人在每种波长下绘制的点数并不相同。在

逻辑是: 对于数据帧中每个唯一的人, 对于那个人的每次实验, 对于每个波长,取每个数据点,并在x轴上绘制反转数,在y轴上绘制反转位置。在

不知道如何构造几个嵌套的循环,这样我就可以获取每个人的记录,然后是唯一的波长,然后分离出增量和减量(存储为0和1),然后绘制这些数据。然后回到一个循环中,对每个波长的人重复这个步骤,对每个实验重复(4x),然后对其他参与者重复相同的步骤。在

下面的代码适用于一个参与者,要求我只将他们的数据导入到一个数据帧中,而不需要任何其他参与者、实验等。实际的数据集要大得多,并且包含每个人的数据的附加列。在

   RevNum   WL     RevPos
0       1  440  20.934543
1       2  440  26.934543
2       3  440  20.354543
3       4  440  26.354543
4       5  440  24.714543


           RevNum          WL      RevPos
count  120.000000  120.000000  120.000000
mean     6.500000  464.000000    7.798258
std      3.466527   17.041718   27.414977
min      1.000000  440.000000  -33.628026
25%      3.750000  452.000000  -19.736296
50%      6.500000  464.000000    9.004679
75%      9.250000  476.000000   31.219357
max     12.000000  488.000000   50.000000

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 120 entries, 0 to 119
Data columns (total 3 columns):
RevNum    120 non-null int64
WL        120 non-null int64
RevPos    120 non-null float64
dtypes: float64(1), int64(2)
memory usage: 2.9 KB

我需要使用的实际数据集更大,例如数据:

   OriginalDataID Person       ...       ExpNumber  LightIntensity
0            1611    JMA       ...               1              60
1            1618    JMA       ...               1              60
2            1621    JMA       ...               1              60
3            1666    JMA       ...               1              60
4            1669    JMA       ...               1              60

[5 rows x 9 columns]

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7135 entries, 0 to 7134
Data columns (total 9 columns):
OriginalDataID    7135 non-null int64
Person            7135 non-null object
Date              7135 non-null object
Threshold0Inc     7135 non-null int64
RevNum            7135 non-null int64
Wavelength        7135 non-null int64
RevPos            7135 non-null float64
ExpNumber         7135 non-null int64
LightIntensity    7135 non-null int64
dtypes: float64(1), int64(6), object(2)
memory usage: 501.8+ KB

这将使用1个人1个实验的数据子集,为5个波长中的每一个生成一个单独的图形:

#import modules aka packages
import pandas as pd # Pandas (advanced data manipulation)
import numpy as np # Numpy (data import, manipulation, export)
import seaborn as sns # Seaborn visualization library
import matplotlib.pyplot as plt # Matplotlib (create trends)

# import data in csv file
# Old Longer Names
# df = pd.read_csv('rev_data1.csv', sep=',', delimiter=None, header='infer', names=['OriginalDataID', 'Person', 'Date', 'Threshold0Inc', 'RevNum', 'Wavelength', 'RevPos', 'ExpNumber', 'LightIntensity'], 
df = pd.read_csv('rev_data10.csv', sep=',', delimiter=None, header='infer', names=['RevNum', 'WL', 'RevPos'], 
index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine='python', 
converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=1, 
nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, 
parse_dates=False,infer_datetime_format=True, keep_date_col=False, date_parser=None, dayfirst=False, 
iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, 
quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, 
error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, 
low_memory=True, memory_map=False, float_precision=None)

####
sns.set(style="ticks")

# Create a dataset 1
pos = df.RevPos
step = df.RevNum
walk = df.WL

# Initialize a grid of plots with an Axes for staircases for each wavelength
grid = sns.FacetGrid(df, col="WL", hue="WL", col_wrap=5, size=1.5)

# Draw a horizontal line at backgound luminance of 0
grid.map(plt.axhline, y=0, ls=":", c=".5")

# Draw a horizontal line showing min max constraints of staircase
grid.map(plt.axhline, y=-50, ls=":", c=".5")
grid.map(plt.axhline, y=50, ls=":", c=".5")

# Draw a line plot to show reversals of staircase
grid.map(plt.plot, "RevNum", "RevPos", marker="o", ms=4)

# Adjust the tick positions and labels
grid.set(xticks=np.arange(13), yticks=[-60, -40, -20, 0, 20, 40, 60],
    xlim=(-.5, 12.5), ylim=(-65, 65))

# Adjust the arrangement of the plots
grid.fig.tight_layout(w_pad=1)

plt.show()

示例图:一个人的数据,1个实验,5个波长w/同时有neg和pos数据。在

Example graph: One person's data, 1 experiment, 5 wavelengths w/both neg and pos data


Tags: 数据nonefalsetruedf绘制参与者null