You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Matplotlib绘制无插值的稀疏数据散点/等高线混合图?

实现不含插值的稀疏数据“散点-等高线混合图”

当然可行!其实你想要的就是把稀疏的数值点用类似等高线的色块标记出来,同时不做插值填充空白区域对吧?咱们完全可以实现,而且最适合的工具是scatter()——毕竟你的数据是离散的稀疏点,contourf()本身是基于网格插值的,对这种数据不太友好,我给你详细讲讲怎么做:

首先先聊聊你的数据集:你提供的DataFrame大部分都是NaN,只有几个孤立位置有数值,直接用contourf()的话,因为缺失值太多,它没法生成有意义的等高线,只会跳过空白区域,达不到你要的“混合图”效果。

方案一:用scatter()实现核心需求(推荐)

scatter()可以精准定位每个有数值的点,我们只需要把这些点画成大色块,用颜色映射表示数值大小,就能完美模拟“散点+等高线”的混合感——每个点对应一个等高线色块,空白区域留空,完全不需要插值。

直接用你的数据集写的代码示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 你的示例数据集
d = {'col1': [0, 0, 0, 0, 0], 'col2': [0, 0.1, 0, 0, 0], 'col3': [0, 0.9, 0, 0, 0], 'col4': [0, 0, 0, 0.3, 0], 'col5': [0, 0, 0, 0, 0]}
df = pd.DataFrame(data=d)
df = df.replace(0, np.nan)

# 提取所有非NaN点的坐标和数值
x_coords = []
y_coords = []
values = []
for y_idx, row in df.iterrows():
    for x_col, val in row.items():
        if not pd.isna(val):
            # 把列名(col1/col2)转换成数值坐标
            x_val = int(x_col.split('col')[1])
            x_coords.append(x_val)
            y_coords.append(y_idx)
            values.append(val)

# 绘制散点图:设置大尺寸的点(模拟色块),用等高线常用的颜色映射
plt.scatter(x_coords, y_coords, s=500, c=values, cmap='viridis', edgecolors='black')

# 添加颜色条,和contourf的用法一致
plt.colorbar(label='数值')

# 配置坐标轴,匹配原始数据的行列
plt.xlabel('X轴(列)')
plt.ylabel('Y轴(行)')
plt.xticks([1,2,3,4,5], df.columns)
plt.yticks(df.index)

# 可选:添加网格线让布局更清晰
plt.grid(True, linestyle='--', alpha=0.7)
plt.title('稀疏数据的散点-等高线混合图')
plt.show()

这段代码的逻辑很简单:先把所有有数值的点的坐标和值提取出来,然后用scatter()把每个点画成带黑边的大色块,颜色对应数值大小,最后配上颜色条和正确的刻度,效果完全符合你的需求。

方案二:用contourf()尝试(不推荐)

如果一定要用contourf(),可以通过设置levels为具体的数值、关闭插值来实现,但因为contourf()本质是基于网格的,结果只会在有数值的网格点周围生成小色块,效果不如scatter()精准。代码示例供你参考:

# 沿用你的数据集
y = df.index.values
x = np.array([1,2,3,4,5])  # 将列名转为数值坐标
z = df.values

# 设置等高线层级为所有非NaN数值,加上上下限
unique_vals = np.unique(values)
levels = np.concatenate([[unique_vals.min()-0.1], unique_vals, [unique_vals.max()+0.1]])

# 绘制contourf,关闭插值
plt.contourf(x, y, z, levels=levels, cmap='viridis', interpolation='none')
plt.colorbar(label='数值')
plt.xticks(x, df.columns)
plt.yticks(y)
plt.title('contourf实现的稀疏数据图')
plt.show()

总结

最适合你需求的工具是**scatter()**,它完美适配稀疏离散数据,不需要插值,同时通过调整点的大小和颜色,能精准实现你要的“散点/等高线混合图”效果。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:21:25