使用seaborn jointplot改变每个点的颜色和标记

19 人关注

我的这段代码稍作修改,从 here :

import seaborn as sns
sns.set(style="darkgrid")
tips = sns.load_dataset("tips")
color = sns.color_palette()[5]
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None,
                  xlim=(0, 60), ylim=(0, 12), color='k', size=7)
g.set_axis_labels('total bill', 'tip', fontsize=16)

我得到了一个漂亮的图 - 然而,对于我的情况,我需要能够改变每个单独的点的颜色和格式。

我试着使用关键词,markerstylefmt,但我得到的错误是TypeError: jointplot() got an unexpected keyword argument

正确的方法是什么?我想避免调用sns.JointGrid并手动绘制数据和边际分布。

4 个评论
cd98
也许我理解错了,但根据 这个答案 ,你不能向 plt.scatter 传递一个标记列表,所以 seaborn 的包装器也不能工作。
说吧。我必须要编辑一下。也许可以在图形创建后清除这些点,然后单独绘制每个点。
最后,这并不难。我所要做的就是 g.ax_joint.cla() 来清除绘制点的坐标轴,然后用你提到的答案绘制点。回归没有了,但我并不真正需要这部分,只是需要有边际分布的点。
cd98
你能不能回答你自己的问题,展示你的代码(然后接受它)?如果你能添加一张图片就更好了,这样未来的人们就可以把它作为参考:)
python
matplotlib
seaborn
pbreach
pbreach
发布于 2014-11-19
6 个回答
pbreach
pbreach
发布于 2016-04-19
已采纳
0 人赞同

解决这个问题与matplotlib的问题几乎没有区别(用不同的标记和颜色绘制散点图),只是我想保留边际分布。

import seaborn as sns
from itertools import product
sns.set(style="darkgrid")
tips = sns.load_dataset("tips")
color = sns.color_palette()[5]
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None,
                  xlim=(0, 60), ylim=(0, 12), color='k', size=7)
#Clear the axes containing the scatter plot
g.ax_joint.cla()
#Generate some colors and markers
colors = np.random.random((len(tips),3))
markers = ['x','o','v','^','<']*100
#Plot each individual point separately
for i,row in enumerate(tips.values):
    g.ax_joint.plot(row[0], row[1], color=colors[i], marker=markers[i])
g.set_axis_labels('total bill', 'tip', fontsize=16)

Which gives me this:

回归线现在已经消失了,但这就是我所需要的。

替换代码0】没有任何方法来控制用于单个点的标记,所以像这样的东西可能是你最好的选择,但你可以做 g.ax_joint.collections[0].set_visible(False) 而不是清除整个Axes,这将保留回归线。
Aku
奇怪的是,这只有在指定了标记的情况下才有效。没有这个,它就不会绘制点!
你怎么知道 ['x','o','v','^','<'] 是可用的标记样式?我发现Seaborn的文档很难浏览。(编辑:我想我找到了 😀 here )
Max Shron
Max Shron
发布于 2016-04-19
0 人赞同

接受的答案太复杂了。 plt.sca() 可以用更简单的方法来做。

import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset("tips")
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None,
                  xlim=(0, 60), ylim=(0, 12))
g.ax_joint.cla() # or g.ax_joint.collections[0].set_visible(False), as per mwaskom's comment
# set the current axis to be the joint plot's axis
plt.sca(g.ax_joint)
# plt.scatter takes a 'c' keyword for color
# you can also pass an array of floats and use the 'cmap' keyword to
# convert them into a colormap
plt.scatter(tips.total_bill, tips.tip, c=np.random.random((len(tips), 3)))
    
我建议跳过对 plt.sca 的调用,直接使用轴对象。 g.ax_joint.scatter(tips.total_bill, ...) 。尽可能避免使用 pyplot 的状态机。
Vincent Jeanselme
Vincent Jeanselme
发布于 2016-04-19
0 人赞同

你也可以在参数列表中直接精确到它,多亏了关键字: joint_kws (在seaborn 0.8.1测试)。如果需要,你也可以用 marginal_kws 改变边际的属性

So your code becomes :

import seaborn as sns
colors = np.random.random((len(tips),3))
markers = (['x','o','v','^','<']*100)[:len(tips)]
sns.jointplot("total_bill", "tip", data=tips, kind="reg",
    joint_kws={"color":colors, "marker":markers})
    
Claire
Claire
发布于 2016-04-19
0 人赞同
  • In seaborn/categorical.py , find def swarmplot .
  • Add parameter marker='o' before **kwargs
  • In kwargs.update , add marker=marker .
  • 然后在用 sns.swarmplot() 绘图时,像用Matplotlib的 plt.scatter() 那样,添加例如 marker='x' 作为参数。

    刚刚遇到了同样的需求,将 marker 作为 kwarg 并不可行。所以我简单看了一下。我们可以用类似的方式设置其他参数。 https://github.com/ccneko/seaborn/blob/master/seaborn/categorical.py

    这里只需要做一个小改动,但这里是GitHub的分叉页面,可以快速参考;)

    Vlamir
    Vlamir
    发布于 2016-04-19
    0 人赞同

    另一个选择是使用JointGrid,因为jointplot是一个包装器,可以简化其使用。

    import matplotlib.pyplot as plt
    import seaborn as sns
    tips = sns.load_dataset("tips")
    g = sns.JointGrid("total_bill", "tip", data=tips)
    g = g.plot_joint(plt.scatter, c=np.random.random((len(tips), 3)))
    g = g.plot_marginals(sns.distplot, kde=True, color="k")
        
    riri
    riri
    发布于 2016-04-19
    0 人赞同

    另外两个答案是复杂的奢望(实际上,它们是由真正了解引擎盖下发生的事情的人做出的)。

    这里有一个人的答案,他只是猜测。但它是有效的!