我想绘制一个seaborn.swarmplot
,其中类别(色相)表示为标记,而散点图的颜色定义了另一列的值。
我发现this great answer非常相似,但我想在数据框中添加另一列,我们将其命名为cat
,用于分类变量,该变量设置为{{1} },而颜色列是通过列hue='cat'
定义的。我希望类别不使用彩色类别,而是用标记进行标记。 c
。我修改了上面提到的答案,以实现至少依赖于c的色图,但也可以按类别进行映射,但是为每个类别设置标记仍然失败:
markers=['x', 'o', 'd']
是否知道如何整合标记以及如何使颜色仅取决于import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colorbar
import matplotlib.colors
import matplotlib.cm
from mpl_toolkits.axes_grid1 import make_axes_locatable
import seaborn as sns
# dataframe
df = pd.DataFrame(
data={'a': [1, 4, 5, 6, 3, 4, 5, 6],
'c': [12, 35, 12, 46, 78, 45, 34, 70],
'cat': [0, 1, 1, 1, 0, 1, 0, 1],
'key': [1, 2, 2, 1, 1, 2, 1, 2]}
)
# Create a matplotlib colormap from the sns seagreen color palette
cmap = sns.light_palette("seagreen", reverse=False, as_cmap=True)
# Normalize to the range of possible values from df["c"]
norm = matplotlib.colors.Normalize(vmin=df["c"].min(), vmax=df["c"].max())
# create a color dictionary (value in c : color from colormap)
colors = {}
for cat, cval in zip(df['cat'], df["c"]):
colors.update({'{0}-{1}'.format(cat, cval) : cmap(norm(cval))})
# save cat-col key as new reformed cat col:
df['cat-color'] = list(colors.keys())
fig = plt.figure(figsize=(5,2.8))
# plot the swarmplot with the colors dictionary as palette
m = sns.swarmplot(x='key', y='a', hue="cat-color", s=12, data=df,
palette=colors, markers=['x', 'o', 'd'])
## create colorbar ##
divider = make_axes_locatable(plt.gca())
ax_cb = divider.new_horizontal(size="5%", pad=0.05)
fig.add_axes(ax_cb)
cb1 = matplotlib.colorbar.ColorbarBase(
ax_cb, cmap=cmap, norm=norm, orientation='vertical')
plt.show()
而不取决于c
?
我还发现this answer处理标记,但是我看不出有什么方法可以将其结合成独立的标记和颜色。