如何用Python从三个列表生成基于正负值的双色热力图?
问题描述
我有三个数据数组initial_R、initial_v和E_total,代码框架如下:
import numpy as np import matplotlib import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import pandas as pd initial_R=[] initial_v=[] E_total=[]
另有代码可正常填充这三个数组,其中initial_R为x坐标,initial_v为y坐标,E_total为对应坐标点的强度值。我希望绘制一个热力图,根据E_total的正负用两种颜色区分每个方格。
尝试过以下代码但无效,也不清楚其运行原理:
df = pd.read_clipboard() df.drop_duplicates(['initial_R','initial_v'], inplace=True) pivot = df.pivot(index='initial_R', columns='initial_v', values='E_total') ax = sns.heatmap(pivot,annot=True) plt.show() print (pivot)
解决方案
问题根源
你之前的代码核心问题是pd.read_clipboard():这个函数用于从系统剪贴板读取表格数据,但你的数据存在内存数组中,因此根本无法读取到目标数据,后续步骤自然无效。
正确实现步骤
要完成需求,需将内存数组转换为DataFrame,整理成热力图所需的二维结构,再自定义颜色映射区分正负值:
- 将数组转换为DataFrame,关联坐标与对应强度值
- 去除重复坐标点(避免重塑数据时出错)
- 将数据重塑为热力图需要的二维矩阵
- 自定义颜色映射,区分正负值
- 绘制热力图
完整代码
import numpy as np import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from matplotlib.colors import ListedColormap # 假设三个数组已被正确填充 initial_R = [] initial_v = [] E_total = [] # 1. 数组转DataFrame df = pd.DataFrame({ 'initial_R': initial_R, 'initial_v': initial_v, 'E_total': E_total }) # 2. 去重:保留每个(initial_R, initial_v)坐标对的唯一值 df.drop_duplicates(['initial_R', 'initial_v'], inplace=True, keep='last') # 3. 重塑为热力图的二维结构:行=initial_R,列=initial_v,单元格值=E_total pivot_df = df.pivot(index='initial_R', columns='initial_v', values='E_total') # 4. 自定义颜色映射:负值用红色,正值用蓝色 cmap = ListedColormap(['red', 'blue']) # 5. 绘制热力图 plt.figure(figsize=(10, 8)) # annot=True会显示每个方格的E_total数值,cbar=False隐藏颜色条(不需要可保留) sns.heatmap(pivot_df, cmap=cmap, annot=False, cbar=False) plt.xlabel('initial_v') plt.ylabel('initial_R') plt.title('E_total 正负热力图') plt.show()
代码说明
pd.DataFrame(...):将三个数组关联成表格,让每个坐标对应唯一的强度值drop_duplicates:如果存在重复的(x,y)坐标,只保留一个,避免pivot时出现索引冲突pivot:将长格式表格转为宽格式二维矩阵,这是seaborn热力图要求的数据结构ListedColormap:自定义离散颜色映射,直接指定正负值对应的颜色,满足“两种颜色区分”的需求
内容的提问来源于stack exchange,提问作者AaAdams
相关产品推荐
相关产品推荐

