
代码绘制成果展示


本期复现一个带有悬浮效果的堆叠条形图。Y轴代表是与目标存在显著相关的因子的数量,X轴是一个两层的分类轴,用于展示不同的地理和时间分区,第二层代表四种不同的气候区域,第一层在每个气候区域内,又按四个季节进行了划分。图例展示了构成堆叠条形图的每个色块所代表的具体地形因子。但是我模仿的时候没有进行相关性分析,而是生成了模拟数据用0和1表示绘制还是不绘制,因为觉得就是进行分析的话可能就写死了,就是没办法用于展示其他分析的数据了,所以用的时候要单独分析,然后设置数据进行绘图。



代码解释


第一部分

# =========================================================================================# ====================================== 1. 库的导入 =========================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom matplotlib.colors import LinearSegmentedColormapimport osplt.rcParams['font.family'] = 'Times New Roman'import matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42

第二部分

# =========================================================================================# ======================================2.设置颜色库 =========================================# =========================================================================================color_schemes = {1: {'Elevation': '#C8C8A9'},}selected_scheme = 20 # 设置要使用的配色方案selected_colors = color_schemes[selected_scheme] # 获取配色方案

第三部分

# =========================================================================================# ======================================3.绘图函数 =========================================# =========================================================================================def create_and_save_plot(data_dict,order,colors,climate_labels,season_labels):

第四部分

绘图前准备
包括画布设置,x轴的设置,定义用于绘制阴影区域的函数,这是很关键的一步,有了它才能让图面出现悬浮的效果
# 创建画布fig, ax = plt.subplots(figsize=(14, 8))# X轴位置x_positions = np.arange(len(climate_labels) * len(season_labels))# 绘制柱子旁边的阴影让柱子看上去像是悬浮在图面上shadow_offset = 0.03 # 阴影的水平偏移量shadow_width = 0.6 # 阴影的宽度shadow_alpha = 0.5 # 阴影的透明度shadow_cmap = LinearSegmentedColormap.from_list("shadow_gradient", # 渐变色的名字[(0, 0, 0, shadow_alpha), (0, 0, 0, 0)] # 定义渐变色)

第五部分

bottom_shadow = np.zeros(len(x_positions)) # 用于记录每个柱子阴影的起始高度for factor in (order): # 遍历绘图values = data_dict[factor] # 获取当前因子的数据值for i, (x_pos, height) in enumerate(zip(x_positions, values)): # 遍历每个柱子的位置和高度if height > 0: # 如果高度大于0,才绘制# 调用前面定义的函数来绘制渐变阴影gradient_bar(ax, # 指定要在哪个子图上进行绘制x=x_pos + shadow_offset, # X轴起始位置y=bottom_shadow[i], # Y轴起始位置width=shadow_width, # 渐变矩形的宽度height=height, # 渐变矩形的高度cmap=shadow_cmap # 颜色映射)bottom_shadow += values # 更新阴影的底部位置,为下一个因子的阴影做准备

第六部分

for factor in (order): # 遍历因子绘图# 绘制条形图ax.bar(x_positions, # X轴位置values, # 高度bottom=bottom_main, # Y轴起始位置label=factor, # 该组条形的名称,用于图例显示color=colors[factor], # 填充颜色width=0.7, # 宽度edgecolor='white', # 边框颜色linewidth=3, # 边框的线宽zorder=2)bottom_main += values # 更新主数据柱子的底部位置,为下一个因子做准备

第七部分

包括背景的横线设置、x、y轴的刻度标注、标题、图框,分割线的参数的设置,还有绘图结果的保存,注意要记得修改文件的保存地址
ax.grid(axis='y', linestyle='-', color='gray', alpha=0.6, zorder=0) # 添加Y轴方向的水平网格线ax.legend(ncol=4, loc='lower center', bbox_to_anchor=(0.35, 1.05), frameon=False, fontsize=14) # 设置图例ax.set_ylabel('Terrain Factor Dimensionality', fontsize=14) # y轴标题ax.set_ylim(0, 7) # y轴范围ax.set_yticks(np.arange(0, 8, 1)) # y轴刻度标注ax.set_xticks(x_positions) # 设置X轴主刻度的位置ax.set_xticklabels(season_labels * len(climate_labels), fontsize=12,rotation=90) # 设置X轴主刻度的标注ax.tick_params(axis='x', which='major', length=0) # 去掉x轴主刻度线ax.tick_params(axis='y', length=0) # 去掉y轴主刻度线ax.set_xlabel('') # 不设置x轴标题# 遍历分组类别for i, climate in enumerate(climate_labels):pos = i * len(season_labels) + (len(season_labels) - 1) / 2.0 # 每个分组标注的中心位置ax.text(pos, -0.8, climate, ha='center', va='top', fontsize=14) # 添加标注plt.subplots_adjust(bottom=0.15) # 调整子图的底部边距,放置显示不全separator_positions = [i * len(season_labels) - 0.5 for i in range(0, len(climate_labels) + 1)] # 计算分隔线的位置ax.set_xticks(separator_positions, minor=True) # 将这些位置设置为X轴的次刻度ax.tick_params(axis='x', which='minor', direction='out', length=60, width=1, color='gray') # 设置分隔线的样式# 去掉顶部、右侧和左侧的图框ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['left'].set_visible(False)ax.text(-0.05, 1.0, 'f', transform=ax.transAxes, fontsize=20, fontweight='bold', va='top') # 添加小标题

第八部分

# =========================================================================================# ====================================4.执行部分========================================# =========================================================================================if __name__ == "__main__":excel_filename = r'data.xlsx' # 原始数据的路径df = pd.read_excel(excel_filename, index_col=[0, 1]) # 读取数据legend_order = list(df.columns)climates = list(df.index.get_level_values(0).unique())seasons = list(df.index.get_level_values(1).unique())data_from_excel = {col: df[col].to_numpy() for col in df.columns}#调用绘图函数create_and_save_plot(data_dict=data_from_excel,order=legend_order,colors=selected_colors,climate_labels=climates,season_labels=seasons,)

如何应用?

1.选择你想要使用到的配色方案:
selected_scheme = 20 2.定义绘图结果的保存路径:
plt.savefig(fr"{selected_scheme}.png", dpi=300, bbox_inches='tight')plt.savefig(fr"{selected_scheme}.pdf", bbox_inches='tight')
3.定义原始数据的输入路径:
excel_filename = r'data.xlsx' 4.定义x轴第一层的数据:
climates = list(df.index.get_level_values(0).unique()) #x轴第一层5.定义x轴第二层的数据:
seasons = list(df.index.get_level_values(1).unique()) #x轴第二层
推荐


获取方式
