1

我的数据框有以下列,它显示了为不同样本测量的压力和相应的体积,例如s_1p:sample-1 的压力和s1_nv:相同样本的相应体积。我想在同一图(不是子图)的 x 轴上显示所有体积列,在 y 轴上显示压力,并将图例标记为样本编号。

df=

 s1_p   s1_nv   s9_p    s9_nv   s21_p   s21_nv  s26_p   s26_nv  s32_p   s32_nv  s37_p   s37_nv  s49_p   s49_nv  s52_p   s52_nv  s105_p  s105_nv s118_p  s118_nv
    0   0.977966    0.000544    0.928902    0.000000    1.140129    0.000000    1.002083    0.000000    0.958008    0.000000    1.301460    0.000000    0.964661    0.000000    0.976303    0.001193    1.002914    0.000246    1.008736    0.000129
    1   1.022041    0.001087    0.953850    0.000000    1.175056    0.000153    1.079422    0.000208    0.980461    0.001955    1.328903    0.000000    0.986282    0.000000    1.004578    0.003279    1.034515    0.000246    1.038673    0.000385
    2   1.050316    0.001268    0.984619    0.000000    1.204163    0.000153    1.140961    0.000208    1.012062    0.002557    1.357178    0.000000    1.015388    0.000125    1.031189    0.004621    1.056137    0.000246    1.061127    0.000513
    3   1.082748    0.001268    1.010399    0.000261    1.224953    0.000153    1.249901    0.000208    1.029526    0.002557    1.382958    0.000191    1.033684    0.000125    1.062790    0.004770    1.085243    0.000493    1.094391    0.000513
    4   1.109360    0.001268    1.031189    0.000261    1.247406    0.000153    1.314766    0.000208    1.075264    0.003159    1.407074    0.000381    1.066948    0.000125    1.097717    0.004770    1.136803    0.000493    1.130981    0.000513
    5   1.127655    0.001268    1.056969    0.000261    1.277344    0.000306    1.459465    0.000417    1.130150    0.003460    1.446159    0.000381    1.113518    0.000250    1.138466    0.004919    1.160919    0.000739    1.149277    0.000641
    6   1.160087    0.001268    1.086075    0.000261    1.302292    0.000459    1.629112    0.000624    1.150108    0.003610    1.472771    0.000381    1.140129    0.000250    1.160088    0.005068    1.225784    0.000739    1.177551    0.000898
    7   1.209152    0.001268    1.117676    0.000392    1.328072    0.000459    1.658218    0.000624    1.171730    0.003911    1.514351    0.000571    1.209984    0.000250    1.212479    0.005217    1.293144    0.000739    1.247406    0.000898
    8   1.259048    0.001268    1.151772    0.000392    1.370483    0.000612    1.748863    0.000624    1.249069    0.005114    1.555100    0.000571    1.278175    0.000250    1.270691    0.005217    1.372978    0.000739    1.310608    0.000898
    9   1.283165    0.001268    1.180878    0.000392    1.399590    0.000612    1.920174    0.000624    1.290649    0.005415    1.575890    0.000571    1.297302    0.000375    1.379631    0.005217    1.420380    0.000986    1.334724    0.000898
    10  1.362167    0.001268    1.227448    0.000392    1.426201    0.000612    2.064041    0.000833    1.333893    0.005716    1.602501    0.000761    1.351357    0.000500    1.466949    0.005217    1.592522    0.001232    1.507698    0.001283
    11  1.446991    0.001449    1.278175    0.000392    1.475266    0.000612    2.252815    0.000833    1.434517    0.006919    1.635765    0.000761    1.385452    0.000500    1.636597    0.005664    1.757179    0.001232    1.666534    0.001796
    12  1.473602    0.001630    1.297302    0.000522    1.541794    0.000765    2.432442    0.000833    1.603333    0.010077    1.698967    0.000761    1.518509    0.000625    1.802917    0.005664    1.778801    0.001726    1.698967    0.001796
    13  1.667366    0.001630    1.316429    0.000522    1.639923    0.000765    2.614563    0.000833    1.626617    0.010077    1.790444    0.000761    1.693977    0.000750    1.840340    0.005664    1.800423    0.002218    1.870277    0.002181
    14  1.837845    0.001630    1.344704    0.000652    1.712273    0.000919    2.812485    0.000833    1.809570    0.010679    1.828697    0.000761    1.715599    0.000750    1.972565    0.006111    1.988365    0.002958    2.044083    0.002181
    15  2.042419    0.001630    1.412063    0.000783    1.861130    0.000919    2.984627    0.000833    1.831192    0.010679    1.856972    0.000761    1.876098    0.000750    2.142212    0.006410    2.167160    0.002958    2.083168    0.002438
    16  2.222878    0.001630    1.476929    0.000783    2.029114    0.001531    3.014565    0.001041    2.003334    0.011732    1.964249    0.000951    2.058220    0.001000    2.173813    0.006410    2.209572    0.003204    2.250320    0.002566
    17  2.256142    0.001630    1.497719    0.000913    2.052398    0.001531    3.169243    0.001041    2.026619    0.011882    2.134727    0.000951    2.265290    0.001125    2.325165    0.006708    2.385040    0.003451    2.417473    0.002695
    18  2.422463    0.001630    1.672356    0.001305    2.163834    0.001531    3.354691    0.001041    2.198761    0.013687    2.299385    0.001142    2.439095    0.001125    2.495644    0.007005    2.556351    0.003697    2.449905    0.002695

当我使用以下代码时,它可以完成工作。

S1_P=df['s1_p']
S1_V=df['s1_nv'] #(similarly for other samples)
plt.plot(S1_P, S1_V, color='r', label='S1')
plt.plot(S9_P, S9_V, color='g', label='S9')
plt.plot(S21_P, S21_V, color='g', label='S21')

但问题是我必须将所有单独的列称为一个系列,然后一次又一次地调用情节。

df.plot(x=["s1_p", 's9_p', 's21_p'] y=["s1_v", 's9_v', 's21_v']) showed error.

我想自动化这个过程,这样我就不必为绘图调用每个单独的列。
使用 seaborn 或 matplotlib 在单个图中绘制数据的任何建议

4

1 回答 1

1

从您提供的数据框开始,我知道绘制您想要的绘图的最简单方法是以适当的方式重新塑造数据框,然后绘制它。

数据框重塑

您需要在具有 3 列的数据框中重新塑造您的数据samplepressurevolume. 为此,我将数据保存在一个新的数据框中DF

samples = list(set([col.replace('s', '').replace('_p', '').replace('_nv', '') for col in df.columns]))

DF = pd.DataFrame(columns = ['sample', 'pressure', 'volume'])

for sample in samples:
    df_tmp = pd.DataFrame()
    for col in df.columns:
        if f's{sample}_' in col:
            df_tmp['sample'] = len(df[col])*[sample]
            if col.endswith('p'):
                df_tmp['pressure'] = df[col]
            else:
                df_tmp['volume'] = df[col]
    DF = DF.append(df_tmp)

DF['sample'] = DF['sample'].astype(int)
DF = DF.sort_values(by = 'sample', ignore_index = True)
DF['sample'] = DF['sample'].astype(str)
    sample  pressure    volume
0        1  1.127655  0.001268
1        1  0.977966  0.000544
2        1  1.022041  0.001087
3        1  1.050316  0.001268
4        1  1.082748  0.001268
5        1  1.109360  0.001268
6        1  1.160087  0.001268
7        1  1.209152  0.001268
8        1  1.283165  0.001268
9        1  1.259048  0.001268

完整代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


df = pd.read_csv(r'data/data.csv')

samples = list(set([col.replace('s', '').replace('_p', '').replace('_nv', '') for col in df.columns]))

DF = pd.DataFrame(columns = ['sample', 'pressure', 'volume'])

for sample in samples:
    df_tmp = pd.DataFrame()
    for col in df.columns:
        if f's{sample}_' in col:
            df_tmp['sample'] = len(df[col])*[sample]
            if col.endswith('p'):
                df_tmp['pressure'] = df[col]
            else:
                df_tmp['volume'] = df[col]
    DF = DF.append(df_tmp)

DF['sample'] = DF['sample'].astype(int)
DF = DF.sort_values(by = 'sample', ignore_index = True)
DF['sample'] = DF['sample'].astype(str)


fig, ax = plt.subplots()

sns.scatterplot(ax = ax, data = DF, x = 'volume', y = 'pressure', hue = 'sample')

plt.show()

阴谋

现在您可以绘制数据,例如您可以使用seaborn.scatterplot

fig, ax = plt.subplots()

sns.scatterplot(ax = ax, data = DF, x = 'volume', y = 'pressure', hue = 'sample')

plt.show()

在此处输入图像描述

于 2021-08-25T10:14:02.907 回答