将 pandas 数据帧处理成 violinplot
Process pandas dataframe into violinplot
我有从 Excel 电子表格中读取的数据。数据对 S1 到 S6 六种场景中的每一种都有大量观察。当我将数据读入我的数据帧 df 时,它看起来如下:
Scenario LMP
0 S1 -21.454544
1 S1 -20.778094
2 S1 -20.027689
3 S1 -19.747170
4 S1 -20.814405
5 S1 -21.955406
6 S1 -23.018960
...
12258 S6 -34.089906
12259 S6 -34.222814
12260 S6 -26.712010
12261 S6 -24.555973
12262 S6 -23.062616
12263 S6 -20.488411
我想创建一个 violinplot,其中六个场景中的每一个都有不同的小提琴。我是 Pandas 和数据框的新手,尽管在过去的一天里有很多 research/testing,但我还是想不出一种优雅的方法来将一些引用传递给我的数据框(将其拆分为每个场景分成不同的系列)将在 axes.violinplot() 语句中工作。例如,我尝试了以下方法,但没有用。我的 axes.violinplot 声明中出现 "ValueError: cannot copy sequence with size 1752 to array axis with dimension 2"。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
axes.violinplot(dataset = [[df.loc[df.Scenario == 'S1']],
[df.loc[df.Scenario == 'S2']],
[df.loc[df.Scenario == 'S3']],
[df.loc[df.Scenario == 'S4']],
[df.loc[df.Scenario == 'S5']],
[df.loc[df.Scenario == 'S6']]
]
)
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
你可以使用seaborn。在这种情况下,导入 seaborn 然后使用 violin plot 可视化场景。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
# plot violin. 'Scenario' is according to x axis,
# 'LMP' is y axis, data is your dataframe. ax - is axes instance
sns.violinplot('Scenario','LMP', data=df, ax = axes)
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
您需要注意如何创建要绘制的数据集。在问题的代码中,您有一个数据框的列表列表。但是,您只需要一个单列数据框列表。
因此,您还需要从过滤后的数据框中只获取 "LMP" 列,否则 violinplot 将不知道要绘制哪一列。
这是一个接近原始代码的工作示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
x = np.random.poisson(lam =3, size=100)
y = np.random.choice(["S{}".format(i+1) for i in range(6)], size=len(x))
df = pd.DataFrame({"Scenario":y, "LMP":x})
fig, axes = plt.subplots()
axes.violinplot(dataset = [df[df.Scenario == 'S1']["LMP"].values,
df[df.Scenario == 'S2']["LMP"].values,
df[df.Scenario == 'S3']["LMP"].values,
df[df.Scenario == 'S4']["LMP"].values,
df[df.Scenario == 'S5']["LMP"].values,
df[df.Scenario == 'S6']["LMP"].values ] )
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
我有从 Excel 电子表格中读取的数据。数据对 S1 到 S6 六种场景中的每一种都有大量观察。当我将数据读入我的数据帧 df 时,它看起来如下:
Scenario LMP
0 S1 -21.454544
1 S1 -20.778094
2 S1 -20.027689
3 S1 -19.747170
4 S1 -20.814405
5 S1 -21.955406
6 S1 -23.018960
...
12258 S6 -34.089906
12259 S6 -34.222814
12260 S6 -26.712010
12261 S6 -24.555973
12262 S6 -23.062616
12263 S6 -20.488411
我想创建一个 violinplot,其中六个场景中的每一个都有不同的小提琴。我是 Pandas 和数据框的新手,尽管在过去的一天里有很多 research/testing,但我还是想不出一种优雅的方法来将一些引用传递给我的数据框(将其拆分为每个场景分成不同的系列)将在 axes.violinplot() 语句中工作。例如,我尝试了以下方法,但没有用。我的 axes.violinplot 声明中出现 "ValueError: cannot copy sequence with size 1752 to array axis with dimension 2"。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
axes.violinplot(dataset = [[df.loc[df.Scenario == 'S1']],
[df.loc[df.Scenario == 'S2']],
[df.loc[df.Scenario == 'S3']],
[df.loc[df.Scenario == 'S4']],
[df.loc[df.Scenario == 'S5']],
[df.loc[df.Scenario == 'S6']]
]
)
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
你可以使用seaborn。在这种情况下,导入 seaborn 然后使用 violin plot 可视化场景。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
# plot violin. 'Scenario' is according to x axis,
# 'LMP' is y axis, data is your dataframe. ax - is axes instance
sns.violinplot('Scenario','LMP', data=df, ax = axes)
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
您需要注意如何创建要绘制的数据集。在问题的代码中,您有一个数据框的列表列表。但是,您只需要一个单列数据框列表。
因此,您还需要从过滤后的数据框中只获取 "LMP" 列,否则 violinplot 将不知道要绘制哪一列。
这是一个接近原始代码的工作示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
x = np.random.poisson(lam =3, size=100)
y = np.random.choice(["S{}".format(i+1) for i in range(6)], size=len(x))
df = pd.DataFrame({"Scenario":y, "LMP":x})
fig, axes = plt.subplots()
axes.violinplot(dataset = [df[df.Scenario == 'S1']["LMP"].values,
df[df.Scenario == 'S2']["LMP"].values,
df[df.Scenario == 'S3']["LMP"].values,
df[df.Scenario == 'S4']["LMP"].values,
df[df.Scenario == 'S5']["LMP"].values,
df[df.Scenario == 'S6']["LMP"].values ] )
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()