在python中从dataframe自动生成图形

在python中从dataframe自动生成图形,python,dataframe,automation,seaborn,graphing,Python,Dataframe,Automation,Seaborn,Graphing,我需要自动生成大约320个单独的图形。我可以为一个人成功地绘制5-18个图形。总共大约有7500多行数据。每行代表一个反转位置 我需要拉动,然后通过以下方式绘图: 1.参与者(19名参与者), 2.波长(波长的数量因人而异,有的只有4个,有的多达20个), 3.增量或减量(正或负条件),以及 4.实验编号(1-4) 下面是使用seaborn为一个参与者显示5个图形的代码,每5个波长显示一个图形。我大约有20名参与者(在数据中以个人姓名首字母的形式列出)。我想写一个脚本,它将为每个人和每个条件生成

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

我需要拉动,然后通过以下方式绘图: 1.参与者(19名参与者), 2.波长(波长的数量因人而异,有的只有4个,有的多达20个), 3.增量或减量(正或负条件),以及 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)]
或者这可以用来排序,但我不知道如何使用它来生成每个人的图表

# sort the data in the dataframe
df.sort_values(['ExpNum', 'IncDec', 'Per', 'WL'], ascending=[True, True, True, True], inplace=True)
我还尝试为我需要调用的每个字段制作字典,但也不知道如何在循环中使用它来调用每个项。这是一个示例,显示了我的数据帧中波长值的唯一实例:

>>> 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个正反转位置和负反转位置。在每种情况下,每个人在每个波长上绘制的点数并不相同

逻辑是: 对于数据框中每个唯一的人, 对于那个人的每个实验, 对于每个波长,获取每个数据点,并在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
图表示例:一个人的数据,1个实验,5个波长,包括neg和pos数据


我一直在读这篇文章,试图弄清楚你的问题到底是什么,但没有用。也许你可以更具体地说明你的处境?你的帖子很长,你有没有办法把它简化成几个问题?谢谢你的反馈。我将看看如何把它分解成几个问题。我是python编程新手。我希望能够根据数据框中的唯一值自动生成数百个图形。我不知道如何使用各种查询创建基于1的多个子数据集。实验2。人,3。条件(阈值pos或neg编号)和4。波长目前,如果我把每个人的实验放在一个单独的.csv文件中,那么我可以通过我的代码运行每个实验。我有20多个参与者,我希望编写一个脚本,可以与所有人一起浏览一个大的.csv文件(而不是20多个单独的文件),并根据需要提取每个图表的数据。
   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
#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()