seaborn / matplotlib中的散点图,其中点大小和颜色由连续数据帧列给出

时间:2017-03-12 23:30:07

标签: python pandas matplotlib

我想在seaborn / matplotlib中制作一个散点图,其中点的大小由数据帧中的(连续)值确定,点的颜色也由数据帧中另一列的连续值确定。在ggplot中,实现方法是:

ggplot(iris) + geom_point(aes(x=Sepal.Width, y=Sepal.Length, size=Petal.Width, color=Petal.Length))

enter image description here (这里的颜色/尺寸是连续的而不是分类值)

seaborn / matplotlib中的语法是什么?

2 个答案:

答案 0 :(得分:5)

以下内容从问题中重现了代码图。 选择一个图例有点麻烦,因为我们必须手动定义一些代理艺术家来放置图例并删除通过seaborn样式生成的第一个自动图例条目。

enter image description here

import seaborn as sns
import matplotlib.pyplot as plt
iris = sns.load_dataset("iris")

plt.scatter(iris.sepal_width, iris.sepal_length, 
            c = iris.petal_length, s=(iris.petal_width**2)*60, cmap="viridis")
ax = plt.gca()

plt.colorbar(label="petal_length")
plt.xlabel("sepal_width")
plt.ylabel("sepal_length")

#make a legend:
pws = [0.5, 1, 1.5, 2., 2.5]
for pw in pws:
    plt.scatter([], [], s=(pw**2)*60, c="k",label=str(pw))

h, l = plt.gca().get_legend_handles_labels()
plt.legend(h[1:], l[1:], labelspacing=1.2, title="petal_width", borderpad=1, 
            frameon=True, framealpha=0.6, edgecolor="k", facecolor="w")

plt.show()

请注意,size参数s表示点的面积。因此,为了使直径与显示的数量成比例,必须将其平方。

答案 1 :(得分:3)

以下是使用Altair

解决此问题的方法
from altair import Chart
import seaborn as sns
iris = sns.load_dataset("iris")
c = Chart(iris)
c.mark_circle().encode(
    x='sepal_width',
    y='sepal_length',
    color='petal_length',
    size='petal_width',
)

enter image description here

对于这样的情节,Altair可能是一个很好的选择。引自他们的网站:

  

Altair是一个基于Vega-Lite的Python声明性统计可视化库。使用Altair,您可以花更多时间了解数据及其含义。