如何在 Seaborn 中制作多个组或类别的联合图?
How to make a jointplot in Seaborn with multiple groups or categories?
我正在尝试在 Seaborn 中创建联合绘图。目标是得到所有 [x,z] 值的散点图,并用 [cat] 对这些值进行颜色编码,并得到这两个类别的分布。然后我还想要 [x,alt_Z] 的散点图和分布图,忽略 NaN 的 alt_Z 值。
使用 Python 3.7
这是一个独立的数据集和我的目标(在 Excel 中制作,因此未显示分布)。
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd
import seaborn as sns
col1 = [1,1.5,3.1,3.4,2,-1]
col2 = [1,-3,2,8,2.5,-1.3]
col3 = [4,3,4,0.5,1,0.3]
col4 = [10,12,10,'NaN',13,'NaN']
col5 = ['A','A','A','B','A','B']
df = pd.DataFrame(list(zip(col1, col2, col3, col4, col5)),
columns =['x', 'y', 'z', 'alt_Z', 'cat'])
display(df)
下面的代码没有完成情节和returns TypeError: The y variable is categorical, but one of ['numeric', 'datetime'] is required
。我也不知道如何在下面的代码中按 [cat] A 和 B 分组,因此它显示为红色并且只有 A 类别正在绘制。
df2 = df[['x', 'y', 'z', 'alt_Z', 'cat']]\
.melt(id_vars=['x', 'y'], value_vars=['z', 'alt_Z'])
g = sns.jointplot(data=df2, x='x', y='value', hue='variable',
palette={'z': 'black', 'alt_Z': 'red'})
dataframe 的一个问题是 col4
包含整数和 'NaN'。由于整数不存在 NaN 值,因此 pandas 使其成为一列对象。将其转换为浮点数将创建一个适当的浮点列,其中 NaN
作为数字。
要创建散点图,两次调用 sns.scatter()
即可:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
col1 = [1, 1.5, 3.1, 3.4, 2, -1]
col2 = [1, -3, 2, 8, 2.5, -1.3]
col3 = [4, 3, 4, 0.5, 1, 0.3]
col4 = [10, 12, 10, 'NaN', 13, 'NaN']
col5 = ['A', 'A', 'A', 'B', 'A', 'B']
df = pd.DataFrame(list(zip(col1, col2, col3, col4, col5)),
columns=['x', 'y', 'z', 'alt_Z', 'cat'])
df['alt_Z'] = df['alt_Z'].astype(float)
ax = sns.scatterplot(data=df, x='x', y='alt_Z', color='black', label='alt_Z')
sns.scatterplot(data=df, x='x', y='z', hue='cat', ax=ax)
plt.show()
从这里,我们可以创建 2 个数据帧:df1
,包含 x
、z
和 cat
。
而 df2
包含 x
和 alt_Z
。将 alt_Z
重命名为 z
并填写包含字符串 alt_Z
的 cat
列将使其类似于 df1
.
然后 jointplot()
可以对两个数据名的串联进行操作:
df1 = df[['x', 'z', 'cat']]
df2 = df[['x', 'alt_Z']].rename(columns={'alt_Z': 'z'}).dropna()
df2['cat'] = 'alt_Z'
g = sns.jointplot(data=df1.append(df2), x='x', y='z', hue='cat', palette={'alt_Z': 'black', 'A': 'orange', 'B': 'green'})
g.ax_joint.set_xlim(-3, 6) # the default limits are too wide for these reduced test data
plt.show()
我正在尝试在 Seaborn 中创建联合绘图。目标是得到所有 [x,z] 值的散点图,并用 [cat] 对这些值进行颜色编码,并得到这两个类别的分布。然后我还想要 [x,alt_Z] 的散点图和分布图,忽略 NaN 的 alt_Z 值。
使用 Python 3.7
这是一个独立的数据集和我的目标(在 Excel 中制作,因此未显示分布)。
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd
import seaborn as sns
col1 = [1,1.5,3.1,3.4,2,-1]
col2 = [1,-3,2,8,2.5,-1.3]
col3 = [4,3,4,0.5,1,0.3]
col4 = [10,12,10,'NaN',13,'NaN']
col5 = ['A','A','A','B','A','B']
df = pd.DataFrame(list(zip(col1, col2, col3, col4, col5)),
columns =['x', 'y', 'z', 'alt_Z', 'cat'])
display(df)
下面的代码没有完成情节和returns TypeError: The y variable is categorical, but one of ['numeric', 'datetime'] is required
。我也不知道如何在下面的代码中按 [cat] A 和 B 分组,因此它显示为红色并且只有 A 类别正在绘制。
df2 = df[['x', 'y', 'z', 'alt_Z', 'cat']]\
.melt(id_vars=['x', 'y'], value_vars=['z', 'alt_Z'])
g = sns.jointplot(data=df2, x='x', y='value', hue='variable',
palette={'z': 'black', 'alt_Z': 'red'})
dataframe 的一个问题是 col4
包含整数和 'NaN'。由于整数不存在 NaN 值,因此 pandas 使其成为一列对象。将其转换为浮点数将创建一个适当的浮点列,其中 NaN
作为数字。
要创建散点图,两次调用 sns.scatter()
即可:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
col1 = [1, 1.5, 3.1, 3.4, 2, -1]
col2 = [1, -3, 2, 8, 2.5, -1.3]
col3 = [4, 3, 4, 0.5, 1, 0.3]
col4 = [10, 12, 10, 'NaN', 13, 'NaN']
col5 = ['A', 'A', 'A', 'B', 'A', 'B']
df = pd.DataFrame(list(zip(col1, col2, col3, col4, col5)),
columns=['x', 'y', 'z', 'alt_Z', 'cat'])
df['alt_Z'] = df['alt_Z'].astype(float)
ax = sns.scatterplot(data=df, x='x', y='alt_Z', color='black', label='alt_Z')
sns.scatterplot(data=df, x='x', y='z', hue='cat', ax=ax)
plt.show()
从这里,我们可以创建 2 个数据帧:df1
,包含 x
、z
和 cat
。
而 df2
包含 x
和 alt_Z
。将 alt_Z
重命名为 z
并填写包含字符串 alt_Z
的 cat
列将使其类似于 df1
.
然后 jointplot()
可以对两个数据名的串联进行操作:
df1 = df[['x', 'z', 'cat']]
df2 = df[['x', 'alt_Z']].rename(columns={'alt_Z': 'z'}).dropna()
df2['cat'] = 'alt_Z'
g = sns.jointplot(data=df1.append(df2), x='x', y='z', hue='cat', palette={'alt_Z': 'black', 'A': 'orange', 'B': 'green'})
g.ax_joint.set_xlim(-3, 6) # the default limits are too wide for these reduced test data
plt.show()