在 seaborn 中绘制多个箱线图?
Plotting multiple boxplots in seaborn?
我想在 pandas 中使用 seaborn 绘制箱线图,因为它是一种更好的数据可视化方式,但我不太熟悉它。我有三个不同指标的数据框,我想比较不同的指标。我将循环访问文件路径。
for path in paths:
df = pd.read_csv(path)
每个指标的 dfs 都是独立的,看起来像这样(其中 .... 表示填充的数据值)。 1、2、3、4、5是列名,表示不同的试验:
1 2 3 4 5
0 ..............
1 ..............
2 ..............
3 ..............
4 ..............
我想并排放置试验 1、2、3、4、5 和 3 个指标中的每一个的所有图,其中三个指标的所有第一个试验图都在左侧,然后所有第二个试验地块都在右边,依此类推。
我怎样才能在 seaborn 中做到这一点?我知道我可以通过循环遍历路径并使用这样的箱线图函数为每个指标单独绘制一个图:
sns.boxplot(data=df)
但是,我如何才能将其他指标的图表并排放置在同一个图表上?
考虑首先为每个相应的数据帧分配一个分组列,例如 Trial,然后 pd.concat
您的数据帧,最后 pd.melt
[=] 的数据20=] 在用 seaborn 绘图之前的长数据框。下面用随机数据演示:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
np.random.seed(44)
# DATAFRAMES WITH TRIAL COLUMN ASSIGNED
df1 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=1)
df2 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=2)
df3 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=3)
cdf = pd.concat([df1, df2, df3]) # CONCATENATE
mdf = pd.melt(cdf, id_vars=['Trial'], var_name=['Number']) # MELT
print(mdf.head())
# Trial Number value
# 0 1 1 -0.750615
# 1 1 1 -1.715070
# 2 1 1 -0.963404
# 3 1 1 0.360856
# 4 1 1 -1.190504
ax = sns.boxplot(x="Trial", y="value", hue="Number", data=mdf) # RUN PLOT
plt.show()
plt.clf()
plt.close()
# libraries
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from random import randint, gauss
# create a DataFrame
df = pd.DataFrame({
'Sensations':[randint(1,3) for i in range(300)]
})
df['Temperature'] = df['Sensations'].map(lambda x: gauss(0.8/x,0.1)*40)
df['Sensations'] = df['Sensations'].map({1:'hot',2:'normal',3:'cold'})
# create plot
ax = sns.boxplot(x="Sensations", y="Temperature", data=df)
# show plot
plt.show()
我想在 pandas 中使用 seaborn 绘制箱线图,因为它是一种更好的数据可视化方式,但我不太熟悉它。我有三个不同指标的数据框,我想比较不同的指标。我将循环访问文件路径。
for path in paths:
df = pd.read_csv(path)
每个指标的 dfs 都是独立的,看起来像这样(其中 .... 表示填充的数据值)。 1、2、3、4、5是列名,表示不同的试验:
1 2 3 4 5
0 ..............
1 ..............
2 ..............
3 ..............
4 ..............
我想并排放置试验 1、2、3、4、5 和 3 个指标中的每一个的所有图,其中三个指标的所有第一个试验图都在左侧,然后所有第二个试验地块都在右边,依此类推。
我怎样才能在 seaborn 中做到这一点?我知道我可以通过循环遍历路径并使用这样的箱线图函数为每个指标单独绘制一个图:
sns.boxplot(data=df)
但是,我如何才能将其他指标的图表并排放置在同一个图表上?
考虑首先为每个相应的数据帧分配一个分组列,例如 Trial,然后 pd.concat
您的数据帧,最后 pd.melt
[=] 的数据20=] 在用 seaborn 绘图之前的长数据框。下面用随机数据演示:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
np.random.seed(44)
# DATAFRAMES WITH TRIAL COLUMN ASSIGNED
df1 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=1)
df2 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=2)
df3 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=3)
cdf = pd.concat([df1, df2, df3]) # CONCATENATE
mdf = pd.melt(cdf, id_vars=['Trial'], var_name=['Number']) # MELT
print(mdf.head())
# Trial Number value
# 0 1 1 -0.750615
# 1 1 1 -1.715070
# 2 1 1 -0.963404
# 3 1 1 0.360856
# 4 1 1 -1.190504
ax = sns.boxplot(x="Trial", y="value", hue="Number", data=mdf) # RUN PLOT
plt.show()
plt.clf()
plt.close()
# libraries
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from random import randint, gauss
# create a DataFrame
df = pd.DataFrame({
'Sensations':[randint(1,3) for i in range(300)]
})
df['Temperature'] = df['Sensations'].map(lambda x: gauss(0.8/x,0.1)*40)
df['Sensations'] = df['Sensations'].map({1:'hot',2:'normal',3:'cold'})
# create plot
ax = sns.boxplot(x="Sensations", y="Temperature", data=df)
# show plot
plt.show()