Автоматизируйте генерацию графиков с помощью Seaborn, используя фрейм данных Pandas - PullRequest
0 голосов
/ 26 июня 2018

Seaborn Facetgrid позволяет мне создавать несколько графиков для одного человека. Однако я не могу изменить код для прохождения цикла, чтобы повторить один и тот же процесс для 20 разных людей.

Это прерывается, когда я пытаюсь вызвать каждый другой человек. Проблема заключается в том, что я вызываю строку с именем фрейма данных, а не сам фрейм данных. Как мне это исправить?

Я начал с одного очень большого фрейма данных, я создал отдельные фреймы данных для каждого человека из этого более крупного фрейма данных. Когда я пытаюсь выполнить цикл по каждому из фреймов данных отдельных людей, я не могу вызвать сам фрейм данных.

Это похоже на строки с вопросами:

for i in Person_u:
    output_file=(i + '.png')
    input_file=(i + '.csv')
    title=i
    db=('df_' + i)

Ниже я включил и код, и код, который работает для 1 человека, и код, который не работает для прохождения через несколько человек.

# import libraries ...
# import data from csv file ...
#create data frame from values in the csv file
df = pd.read_csv(input_file, sep=',', delimiter=None, header='infer', 
    names=['LH', 'RevID', 'OrigID', 'Person', 'Date', 'File', 
    'Threshold', 'StepSize', 'RevNum', 'WL', 'RevPos', 'ExpNum', 'Light', 'ThExp'], 
    usecols=['OrigID', 'Person', 'Date', 'Threshold', 'RevNum', 'WL', 'RevPos', 'ExpNum', 'ThExp'], 
    engine='python', skiprows=1, infer_datetime_format=True)

# By Experiment
# Experiment 1, 2, 3, 4 (hundreds of rows, etc.)
df_TLR_1 = df.loc[(df.Person == 'TLR') & (df.ExpNum == 1)]
df_KJE_1 = df.loc[(df.Person == 'KJE') & (df.ExpNum == 1)]
df_NMP_2 = df.loc[(df.Person == 'NMP') & (df.ExpNum == 2)]
df_SFO_2 = df.loc[(df.Person == 'SFO') & (df.ExpNum == 2)]
df_MTC_3 = df.loc[(df.Person == 'MTC') & (df.ExpNum == 3)]
df_ZBL_3 = df.loc[(df.Person == 'ZBL') & (df.ExpNum == 3)]
df_MTC_4 = df.loc[(df.Person == 'MTC') & (df.ExpNum == 4)]
df_TLR_1 = df.loc[(df.Person == 'RJI') & (df.ExpNum == 4)]

Person_u = df.Person.unique()
ExpNum_u = df.ExpNum.unique()
WL_u = df.WL.unique()
ThExp_u = df.ThExp.unique()

# seaborn set stylesns.set(style="ticks")
grid = sns.FacetGrid(df_TLR_1, col="WL", hue="ThExp", col_wrap=4, size=4)
grid.map(plt.axhline, y=0, ls=":", c=".5")
# Draw a horizontal line showing min max constraints of staircase
if df_TLR_1.iloc[0,7] == 1:
    grid.map(plt.axhline, y=-60, ls=":", c=".5")
    grid.map(plt.axhline, y=40, ls=":", c=".5")
    grid.map(plt.plot, "RevNum", "RevPos", marker="o", ms=4)
    grid.set(xticks=np.arange(13), yticks=[-65, -60, -40, -20, 0, 20, 40, 45], xlim=(-.5, 12.5), ylim=(-65, 45))
elif df_TLR_1.iloc[0,7] == 4:
    grid.map(plt.axhline, y=-50, ls=":", c=".5")
    grid.map(plt.axhline, y=50, ls=":", c=".5")
    grid.map(plt.plot, "RevNum", "RevPos", marker="o", ms=4)
    grid.set(xticks=np.arange(13), yticks=[-60, -40, -20, 0, 20, 40, 60], xlim=(-.5, 12.5), ylim=(-65, 65))
else:
    print('Error. Experiment Number not 1-4.')
# Draw a line plot to show reversals of staircase
# Adjust the arrangement of the plots
grid.fig.tight_layout(w_pad=.5)
this_name=df_TLR_1.iloc[0,1]
th_experiment=df_TLR_1.iloc[0,8]
this_experiment=th_experiment[-4:8]

#plt.suptitle(df_TLR_1.iloc[0,1] + df_TLR_1.iloc[0,8], fontsize=20)
plt.suptitle(this_name + ' ' + this_experiment, fontsize=20, ha='right')
plt.savefig(this_name + ' ' + this_experiment + '.png')
plt.show()

Когда я пытаюсь изменить его так, чтобы он проходил через каждого уникального человека, я не могу добавить три буквы и номер эксперимента к df_XXX_X. Например, изменив df_RJI_1 на df_MTC_3 и т. Д.

for i in Person_u:
    output_file=(i + '.png')
    input_file=(i + '.csv')
    title=i
    db=('df_' + i)
    #seaborn set style
    sns.set(style="ticks")
    grid = sns.FacetGrid(db, col="WL", hue="ThExp", col_wrap=5, size=4)
    grid.map(plt.axhline, y=0, ls=":", c=".5")
    # Draw a horizontal line showing min max constraints of staircase
    if db[0,7] == 1:
        grid.map(plt.axhline, y=-40, ls=":", c=".5")
        grid.map(plt.axhline, y=60, ls=":", c=".5")
    elif db[0,7] == 4:
        grid.map(plt.axhline, y=-50, ls=":", c=".5")
        grid.map(plt.axhline, y=50, ls=":", c=".5")
    else:
        print('Error. Experiment Number not 1-4.')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-2b9785282fe1> in <module>()
      6     #seaborn set style
      7     sns.set(style="ticks")
----> 8     grid = sns.FacetGrid(db, col="WL", hue="ThExp", col_wrap=5, size=4)
      9     grid.map(plt.axhline, y=0, ls=":", c=".5")
     10     # Draw a horizontal line showing min max constraints of staircase

c:\users\rijekah\appdata\local\programs\python\python35\lib\site-packages\seaborn\axisgrid.py in __init__(self, data, row, col, hue, col_wrap, sharex, sharey, size, aspect, palette, row_order, col_order, hue_order, hue_kws, dropna, legend_out, despine, margin_titles, xlim, ylim, subplot_kws, gridspec_kws)
    235             hue_names = None
    236         else:
--> 237             hue_names = utils.categorical_order(data[hue], hue_order)
    238 
    239         colors = self._get_palette(data, hue, hue_order, palette)

TypeError: string indices must be integers

Это пример графика, когда он работает: enter image description here

# seaborn set stylesns.set(style="ticks")
grid = sns.FacetGrid(df_TLR_1, col="WL", hue="ThExp", col_wrap=3, size=6)
grid.map(plt.axhline, y=0, ls=":", c=".5")
# Draw a horizontal line showing min max constraints of staircase
if df_TLR_1.iloc[0,7] == 1:
    grid.map(plt.axhline, y=-60, ls=":", c=".5")
    grid.map(plt.axhline, y=40, ls=":", c=".5")
    grid.map(plt.plot, "RevNum", "RevPos", marker="o", ms=4)
    grid.set(xticks=np.arange(13), yticks=[-65, -60, -40, -20, 0, 20, 40, 45], xlim=(-.5, 15.5), ylim=(-65, 45))
elif df_TLR_1.iloc[0,7] == 4:
    grid.map(plt.axhline, y=-50, ls=":", c=".5")
    grid.map(plt.axhline, y=50, ls=":", c=".5")
    grid.map(plt.plot, "RevNum", "RevPos", marker="o", ms=4)
    grid.set(xticks=np.arange(13), yticks=[-60, -40, -20, 0, 20, 40, 60], xlim=(-.5, 12.5), ylim=(-65, 65))
else:
    print('Error. Experiment Number not 1-4.')

# Adjust the arrangement of the plots
grid.fig.tight_layout(w_pad=.5)
this_name=df_TLR_1.iloc[0,1]
th_experiment=df_TLR_1.iloc[0,9]
this_experiment=th_experiment[-4:8]

# add figure title and save figure
plt.suptitle(this_name + ' ' + this_experiment, fontsize=20, ha='right')
plt.savefig(this_name + ' ' + this_experiment + '.png')

1 Ответ

0 голосов
/ 27 июня 2018

Вы создаете строку вместо фактических имен переменных. Использование метода eval исправит это.

Вместо того, что вы в настоящее время используете для линии БД, измените ее на

db = eval('df_'+i)

и это должно решить вашу проблему.

...