首页 > 解决方案 > 根据散点图中的另一列定义气泡大小和气泡颜色(matplotlib)

问题描述

我正在构建一个简单的散点图,它从 xls 文件中读取数据。这是经典的预期寿命 x 人均 GDP 散点图。这是代码:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm

#ler a terceira sheet da planilha
data = pd.read_excel('sample.xls', sheet_name=0)
data.head()

plt.scatter(x = data['LifeExpec'],
        y = data['GDPperCapita'],
        s = data['PopX1000'],
        c = data['PopX1000'],
        cmap=cm.viridis,
        edgecolors = 'none',
        alpha = 0.7)

for estado in range(len(data['UF'])):
    plt.text(x = data['LifeExpec'][estado],
         y = data['GDPperCapita'][estado],
         s = data['UF'][estado],
         fontsize = 14)

plt.colorbar()
plt.show()

.xls 文件: 在此处输入图像描述

xls 文件 (PopX1000) 中的人口列正在定义气泡的大小,目前它也在定义它们的颜色。我希望气泡根据人口改变大小(就像现在一样),但颜色会根据国家所在的地区而改变。

我相信我不能简单地更改 c 属性,因为它需要一个浮点值。关于如何做到这一点的任何提示?

标签: pythonpython-3.xmatplotlib

解决方案


您可以将 转换Region为数字表示,并将其用作颜色图的“键”。下面是两种方法(一种被注释掉,随便选一个,结果应该是一样的):

plt.scatter(x = data['LifeExpec'],
        y = data['GDPperCapita'],
        s = data['PopX1000'],
        c = pd.factorize(data['Region'])[0],
        # Alternatively:
        # c = data['Region'].astype('category').cat.codes
        cmap=cm.viridis,
        edgecolors = 'none',
        alpha = 0.7)

推荐阅读