如何使用Python绘制基于X、Y、半径、强度字段的彩色变半径圆图
实现方案
使用Matplotlib的Circle补丁类可以完美满足可变半径圆形的绘制需求,配合分箱映射色阶即可实现你要的效果,具体实现如下:
核心实现逻辑
- 先对
Intensity字段做分箱:可以选择等宽分箱或者等频分箱,划分为4~5个区间,每个区间绑定一个固定颜色 - 遍历所有数据点,为每个点生成对应半径的圆形实例,颜色匹配对应分箱的色值
- 把所有圆形添加到画布后调整坐标轴,保证圆形不会被拉伸
示例代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.patches import Circle from matplotlib.colors import ListedColormap # 替换为你的真实数据 # data = pd.read_csv("你的数据文件.csv", usecols=["X", "Y", "R", "Intensity"]) # 这里是模拟的样本数据 np.random.seed(42) data = pd.DataFrame({ "X": np.random.uniform(0, 20, 80), "Y": np.random.uniform(0, 20, 80), "R": np.random.uniform(0.2, 1.2, 80), "Intensity": np.random.uniform(0, 200, 80) }) # 1. 把Intensity分为5个分箱,对应5种固定颜色 bin_num = 5 data["color_bin"] = pd.cut(data["Intensity"], bins=bin_num, labels=False) # 自定义分箱对应的颜色,可根据需求修改 custom_cmap = ListedColormap(["#f0f9e8", "#bae4bc", "#7bccc4", "#43a2ca", "#0868ac"]) # 2. 绘制画布 fig, ax = plt.subplots(figsize=(9, 9)) # 逐个添加圆形 for _, row in data.iterrows(): circle = Circle( xy=(row["X"], row["Y"]), radius=row["R"], color=custom_cmap(row["color_bin"]), alpha=0.75, # 半透明处理重叠问题 edgecolor="#ffffff", # 白边区分相邻圆形 linewidth=0.5 ) ax.add_patch(circle) # 3. 调整坐标轴配置 ax.set_xlim(data["X"].min() - 1, data["X"].max() + 1) ax.set_ylim(data["Y"].min() - 1, data["Y"].max() + 1) ax.set_aspect("equal") # 强制等比例,避免圆形被拉伸成椭圆 # 添加色标说明 sm = plt.cm.ScalarMappable(cmap=custom_cmap, norm=plt.Normalize(vmin=data["Intensity"].min(), vmax=data["Intensity"].max())) sm.set_array([]) plt.colorbar(sm, label="Intensity", shrink=0.8) plt.xlabel("X") plt.ylabel("Y") plt.show()
可选优化方案
- 如果数据量很大、圆形重叠严重,可以调整
alpha参数降低透明度,或者新增排序逻辑让高Intensity的圆形绘制在上层 - 如果需要交互效果(悬停看数值、缩放),可以改用Plotly的散点图接口,通过
marker_size映射半径R,marker_color映射分箱后的Intensity即可实现
内容的提问来源于stack exchange,提问作者Henri Plana
相关产品推荐
相关产品推荐

