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




