如何使用 seaborn 在一个图上绘制数据网格的群图
How to plot a swarmplot of a grid of data, on one plot with seaborn
多年来,我一直在尝试从 pandas 数据框中按照我想要的方式在 seaborn 上绘制这些数据。如有任何建议,我们将不胜感激。
数据在数据框中,看起来像这样,有 12 个月,11 列加上一个月列:
Month FSRPX1M VOX1M XLB1M ... XLP1M XLU1M XLV1M XLY1M
0 Jan 0.087643 -0.561428 -0.409286 ... -0.177143 0.232858 0.521428 0.457857
1 Feb 0.132429 -0.265715 0.470715 ... 0.067142 -0.479286 -0.177143 0.363571
2 Mar 0.152429 1.002142 0.437857 ... 0.588573 0.671428 0.055000 0.727856
3 Apr 0.150071 2.445000 1.331428 ... 0.551428 1.100715 0.790715 2.175714
4 May -0.089429 -0.115714 0.275000 ... 0.240000 0.113572 0.650716 -0.366429
我想要做的是绘制一个群体图,X 轴为月份,Y 轴为数字,每个月有 11 'dots',代表 11 列,以及相关的颜色编码键。
我尝试了各种方法,包括[其中 df 是数据框,val_list 是我想要作为点的列的列表]:
sns.swarmplot(data = df, x=df['Month'], y = df[val_list])
和
sns.swarmplot(data = df, x=df['Month'], hue = df[val_list])
以及尝试对数据帧进行切片,并使用 for 循环一次绘制一列:
for e in val_list:
sns.stripplot(data = df, x=df['Month'], y = df[e])
任何对我做错的帮助和解释都会很棒,谢谢
最后一个画了个图,但是所有的点都是一样的颜色,没有标注
要使用 hue
,Seaborn 需要 "long form". Pandas' melt
中的数据可用于将“宽”数据帧转换为“长”数据帧。 Set3
颜色图有 12 种颜色(默认 tab10
只有 10 种颜色)。
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
elements = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron', 'Carbon',
'Nitrogen', 'Oxygen', 'Fluorine', 'Neon', 'Sodium']
df = pd.DataFrame(np.random.randn(12, len(elements)), columns=elements)
df['Month'] = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df_long = df.melt(id_vars='Month', var_name='Element', value_name='Value')
ax = sns.swarmplot(data=df_long, x='Month', y='Value', hue='Element', palette='Set3')
ax.legend(bbox_to_anchor=(1.01, 1.02), loc='upper left', title='Element')
plt.tight_layout()
plt.show()
多年来,我一直在尝试从 pandas 数据框中按照我想要的方式在 seaborn 上绘制这些数据。如有任何建议,我们将不胜感激。
数据在数据框中,看起来像这样,有 12 个月,11 列加上一个月列:
Month FSRPX1M VOX1M XLB1M ... XLP1M XLU1M XLV1M XLY1M
0 Jan 0.087643 -0.561428 -0.409286 ... -0.177143 0.232858 0.521428 0.457857
1 Feb 0.132429 -0.265715 0.470715 ... 0.067142 -0.479286 -0.177143 0.363571
2 Mar 0.152429 1.002142 0.437857 ... 0.588573 0.671428 0.055000 0.727856
3 Apr 0.150071 2.445000 1.331428 ... 0.551428 1.100715 0.790715 2.175714
4 May -0.089429 -0.115714 0.275000 ... 0.240000 0.113572 0.650716 -0.366429
我想要做的是绘制一个群体图,X 轴为月份,Y 轴为数字,每个月有 11 'dots',代表 11 列,以及相关的颜色编码键。
我尝试了各种方法,包括[其中 df 是数据框,val_list 是我想要作为点的列的列表]:
sns.swarmplot(data = df, x=df['Month'], y = df[val_list])
和
sns.swarmplot(data = df, x=df['Month'], hue = df[val_list])
以及尝试对数据帧进行切片,并使用 for 循环一次绘制一列:
for e in val_list:
sns.stripplot(data = df, x=df['Month'], y = df[e])
任何对我做错的帮助和解释都会很棒,谢谢
最后一个画了个图,但是所有的点都是一样的颜色,没有标注
要使用 hue
,Seaborn 需要 "long form". Pandas' melt
中的数据可用于将“宽”数据帧转换为“长”数据帧。 Set3
颜色图有 12 种颜色(默认 tab10
只有 10 种颜色)。
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
elements = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron', 'Carbon',
'Nitrogen', 'Oxygen', 'Fluorine', 'Neon', 'Sodium']
df = pd.DataFrame(np.random.randn(12, len(elements)), columns=elements)
df['Month'] = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df_long = df.melt(id_vars='Month', var_name='Element', value_name='Value')
ax = sns.swarmplot(data=df_long, x='Month', y='Value', hue='Element', palette='Set3')
ax.legend(bbox_to_anchor=(1.01, 1.02), loc='upper left', title='Element')
plt.tight_layout()
plt.show()