
代码绘制成果展示










代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport matplotlib.patches as patchesimport matplotlib.patheffects as peimport matplotlib.colors as mcolorsimport matplotlib

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#5ca2fb', '#8ec3a5', '#ff9f9b', '#abe5ea', '#fdf6c2', '#c9cbfd', '#bae8ca', '#02ba6f', '#ff9999', '#99ccff'],}SCHEME_ID = 60 #使用的颜色方案CORR_METHOD = 'pearson' #指定相关性计算方法P_VALUE_THRESHOLD = 0.05 #显著性的P值阈值BG_COLOR = '#ffffff' #背景颜色colors = COLOR_SCHEMES[SCHEME_ID] #提取出对应的颜色列表color_pos = colors[0] # 正相关的极端色color_neg = colors[7] # 代表负相关的极端色

第三部分

# =========================================================================================# ======================================3.辅助函数,用来将系数值映射到渐变色系======================================# =========================================================================================def get_interpolated_color(val):c_p = np.array(mcolors.to_rgb(color_pos)) #正相关HEX颜色转换成RGBc_n = np.array(mcolors.to_rgb(color_neg)) #负相关HEX颜色转换成RGBc_w = np.array([1.0, 1.0, 1.0]) #纯白色的RGB数组if val > 0:c = val * c_p + (1 - val) * c_w #将白色与正相关颜色按照数值比例进行线性插值计算else:c = (-val) * c_n + (1 + val) * c_w #将白色与负相关颜色按照绝对值比例进行线性插值计算return tuple(c)

第四部分

# =========================================================================================# ======================================4.绘图函数======================================# =========================================================================================def draw_cartoon_policy_chart(labels, corr_matrix, p_matrix):# 创建画布fig, ax = plt.subplots(figsize=(14, 12))fig.patch.set_facecolor(BG_COLOR) #设置外围的背景色ax.set_facecolor(BG_COLOR) #设置绘图区主坐标系的背景色n = len(labels) #标签的总数量CELL_SIZE = 10 #相关性方块的固定尺寸SPACING = 11.5 #单元格之间的间隔

第五部分

#遍历矩阵的行for i in range(n):for j in range(n): #遍历列val = corr_matrix[i, j] #获取第 i 行、第 j 列对应的相关系数数值p_val = p_matrix[i, j] #显著性检验x_pos = j * SPACING #当前方块中心点的X坐标y_pos = (n - 1 - i) * SPACING #Y坐标# 根据 P 值是否小于显著性标准来决定文字变红还是黑色text_color = 'red' if p_val < P_VALUE_THRESHOLD else 'black'# 在对应方块中心点的 X 轴横坐标准备写入数值文本ax.text(x_pos, #Xy_pos, #Yf"{val:.2f}", #文本ha='center', #水平va='center', #垂直fontsize=11, #大小fontweight='bold', #加粗color=text_color, # 文本颜色bbox=dict(boxstyle="circle,pad=0.2", #圆形底色框facecolor="white", #圆形文字背景框的底色edgecolor="black", #圆形文字背景框边缘线颜色linewidth=1.5), #边缘线的粗细zorder=10) #层

第六部分

ax.axis('off') #隐藏默认的刻度线、刻度值#遍历所有的标签for idx, label in enumerate(labels):#y轴标注ax.text(-CELL_SIZE / 2 - 2, #x(n - 1 - idx) * SPACING, #ylabel, #标签ha='right', #水平va='center', #垂直fontsize=14, #字体大小fontweight='bold', #加粗color='#444', #颜色)

第七部分

cb_x = (n - 1) * SPACING + CELL_SIZE / 2 + 6 #颜色条起始X轴坐标cb_y_bottom = -CELL_SIZE / 2 #颜色条底部Y坐标cb_y_top = (n - 1) * SPACING + CELL_SIZE / 2 #颜色条顶部Y坐标cb_width = 4.5 #宽度#绘制承载颜色条本体的白色垫底外壳cb_base = patches.FancyBboxPatch((cb_x, cb_y_bottom), #坐标cb_width, #宽度cb_y_top - cb_y_bottom, #高度boxstyle="round,pad=0,rounding_size=1.5", #圆角mutation_aspect=1, #圆角的比例facecolor='white', #填充色edgecolor='white', #边框色linewidth=2.5, #线段粗细zorder=2 #层)scale_vals = [1.0, 0.5, 0.0, -0.5, -1.0] #颜色条数值刻度# 遍历for val in scale_vals:#算出该数值刻度具体对Y轴的坐标y_i = cb_y_bottom + ((val + 1.0) / 2.0) * (cb_y_top - cb_y_bottom)#添加标注ax.text(cb_x + cb_width + 4, #xy_i, #yf"{val:.1f}", #文本ha='left', #水平va='center', #垂直fontsize=13, #大小fontweight='bold', #加粗color='#333', #颜色zorder=6) #层

第八部分

ax.set_xlim(-22, cb_x + cb_width + 16) #X轴范围ax.set_ylim(-18, cb_y_top + 15) #Y轴范围title_x = ((n - 1) * SPACING) / 2 #方块区域中线位置所在的X轴坐标#加上标题ax.text(title_x, #Xcb_y_top + 9, #yf"Policy Analysis Heatmap ({CORR_METHOD.capitalize()})", #文本ha='center', #水平va='center', #垂直fontsize=26, #大小color='#111', #颜色fontweight='bold', #加粗)

第九部分

# =========================================================================================# ======================================5.执行部分======================================# =========================================================================================if __name__ == '__main__':INPUT_EXCEL_PATH = r'\data.xlsx' #原始数据路径df_raw = pd.read_excel(INPUT_EXCEL_PATH) #读取数据labels = df_raw.columns.tolist() #提取标签n = len(labels) #统计到底有多少列数据corr_matrix = np.zeros((n, n)) #用于存储相关系数p_matrix = np.zeros((n, n)) #用于存储P检验数值结果#遍历行for i in range(n):#遍历列for j in range(n):if i == j: #行列号一样corr_matrix[i, j] = 1.0 #相关系数p_matrix[i, j] = 0.0 #Pcorr_matrix[i, j] = corr #相关系数p_matrix[i, j] = p_val #P#调用绘图函数draw_cartoon_policy_chart(labels, corr_matrix, p_matrix)

如何应用到你自己的数据

1.设置配色方案:
SCHEME_ID = 60 #使用的颜色方案2.设置相关性分析方法:
CORR_METHOD = 'pearson' #指定相关性计算方法3.设置绘图结果的保存地址:
png_filename = fr'scheme_{CORR_METHOD}_{SCHEME_ID}.png'4.设置原始数据的文件路径:
INPUT_EXCEL_PATH = r'data.xlsx' #原始数据路径
推荐


获取方式
