如何用Python绘制重叠方块越多颜色越深的matplotlib可视化图表?
实现思路
你需要的重叠方块颜色随重叠数量加深的效果,核心可以通过两种方案实现:一是使用正方形标记的散点图叠加半透明效果,重叠区域自然会因为多层半透明色块叠加加深颜色;二是通过2D直方图统计每个网格内的样本数量,将颜色映射为数量值,数量越大颜色越深。第一种方案代码更简单,和你提供的示例样式匹配度更高。
可运行代码示例
方案1:半透明正方形散点实现
import numpy as np import matplotlib.pyplot as plt # 模拟两类样本数据,可替换为你自己的数据集 np.random.seed(42) # 第一类样本(示例中蓝色类) sample_count1 = 2000 x1 = np.random.normal(loc=0, scale=1.5, size=sample_count1) y1 = np.random.normal(loc=0, scale=1.5, size=sample_count1) # 第二类样本(示例中橙色类) sample_count2 = 2000 x2 = np.random.normal(loc=2, scale=1.5, size=sample_count2) y2 = np.random.normal(loc=2, scale=1.5, size=sample_count2) plt.figure(figsize=(8, 6)) # 绘制第一类样本,marker='s'表示正方形标记,alpha控制透明度,s控制方块大小 plt.scatter(x1, y1, marker='s', s=30, c='#1f77b4', alpha=0.2, label='类别1') # 绘制第二类样本 plt.scatter(x2, y2, marker='s', s=30, c='#ff7f0e', alpha=0.2, label='类别2') # 配置图表样式 plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('重叠方块密度图') plt.legend() plt.grid(alpha=0.3) plt.show()
参数调整说明
- 调整
alpha参数:值越小单块方块透明度越高,需要更多重叠才会明显加深颜色,可根据你的样本量调整 - 调整
s参数:控制单个方块的大小,匹配你需要的网格密度 - 调整
c参数:替换为你需要的方块颜色
方案2:2D直方图实现(适合超大样本量场景)
如果你的样本量超过10万,散点图渲染会变慢,可以用2D直方图方案:
import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Patch # 复用上面的模拟数据 np.random.seed(42) sample_count1 = 50000 x1 = np.random.normal(loc=0, scale=1.5, size=sample_count1) y1 = np.random.normal(loc=0, scale=1.5, size=sample_count1) sample_count2 = 50000 x2 = np.random.normal(loc=2, scale=1.5, size=sample_count2) y2 = np.random.normal(loc=2, scale=1.5, size=sample_count2) plt.figure(figsize=(8, 6)) # 统一网格边界 bins = np.linspace(-4, 7, 30) # 统计两类样本的2D分布 hist1, x_edge, y_edge = np.histogram2d(x1, y1, bins=bins) hist2, x_edge, y_edge = np.histogram2d(x2, y2, bins=bins) # 绘制两类分布热图 plt.imshow(hist1.T, origin='lower', extent=[x_edge[0], x_edge[-1], y_edge[0], y_edge[-1]], cmap='Blues', alpha=0.7) plt.imshow(hist2.T, origin='lower', extent=[x_edge[0], x_edge[-1], y_edge[0], y_edge[-1]], cmap='Oranges', alpha=0.7) # 配置样式和图例 plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('2D直方图密度图') legend_items = [Patch(facecolor='#1f77b4', label='类别1'), Patch(facecolor='#ff7f0e', label='类别2')] plt.legend(handles=legend_items) plt.grid(alpha=0.3) plt.show()

内容的提问来源于stack exchange,提问作者Eiffelbear
相关产品推荐
相关产品推荐

