You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matplotlib散点图:按不同列分别设置气泡大小与颜色

嗨,这个问题其实很容易解决!matplotlib的c参数确实要求输入数值型数据,但我们可以把分类性质的Region列转换成数值编码,或者直接映射到自定义颜色,下面给你两种实用的方案:


方案1:自动将分类地区转换为数值编码(适合地区数量不固定的情况)

这种方法会自动给每个地区分配唯一的数值编码,再搭配分类色彩映射,不用手动指定颜色,适合地区数量可能变化的场景。

修改后的完整代码:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.patches as mpatches  # 用于创建图例补丁

# 读取xls文件的第一个sheet(注:如果是第三个sheet,要改成sheet_name=2)
data = pd.read_excel('sample.xls', sheet_name=0)
data.head()

# 将Region列转换为数值编码,同时获取对应的地区名称列表
region_codes, region_names = pd.factorize(data['Region'])
# 选择分类色彩映射,tab10适合最多10个分类,tab20支持更多分类
cmap = cm.get_cmap('tab10', len(region_names))

# 绘制散点图:大小保留PopX1000,颜色用地区编码
plt.scatter(x = data['LifeExpec'], y = data['GDPperCapita'], 
            s = data['PopX1000'], c = region_codes, 
            cmap=cmap, 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)

# 创建地区图例
legend_patches = [mpatches.Patch(color=cmap(i), label=name) for i, name in enumerate(region_names)]
plt.legend(handles=legend_patches, title='Regiões')

plt.xlabel('Life Expectancy')
plt.ylabel('GDP per Capita')
plt.title('Life Expectancy vs GDP per Capita by Region')

plt.show()

方案2:手动指定各地区的颜色(适合自定义色彩风格)

如果你想完全控制每个地区的颜色,比如贴合品牌色或视觉需求,可以手动建立地区和颜色的映射关系。

修改后的完整代码:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# 读取数据
data = pd.read_excel('sample.xls', sheet_name=0)
data.head()

# 手动定义每个地区对应的颜色(可根据喜好调整)
region_color_map = {
    'Norte': '#FF6B6B',
    'Nordeste': '#4ECDC4',
    'Sudeste': '#45B7D1',
    'Sul': '#96CEB4',
    'Centro-Oeste': '#FFEAA7'
}

# 将Region列映射为对应的颜色列表
point_colors = data['Region'].map(region_color_map)

# 绘制散点图
plt.scatter(x = data['LifeExpec'], y = data['GDPperCapita'], 
            s = data['PopX1000'], c = point_colors, 
            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)

# 创建自定义图例
legend_patches = [mpatches.Patch(color=color, label=region) for region, color in region_color_map.items()]
plt.legend(handles=legend_patches, title='Regiões')

plt.xlabel('Life Expectancy')
plt.ylabel('GDP per Capita')
plt.title('Life Expectancy vs GDP per Capita by Region')

plt.show()

小提醒

注意到你的代码注释是葡萄牙语,所以图例标题用了Regiões,如果需要英文可以改成Regions;另外原代码注释提到读取“terceira sheet(第三个工作表)”,但代码里写的是sheet_name=0(第一个工作表),如果确实要读第三个,记得改成sheet_name=2哦。

内容的提问来源于stack exchange,提问作者Geralt

火山引擎 最新活动