
代码绘制成果展示

论文:Closing maize yield gaps in North China plain: Based on plot-scale farmer survey and simulation










代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================color_schemes = {1: {'Age': '#691F73', 'Education': '#FF5000', 'Area': '#0062A5', 'Train_Yes': '#E22510', 'Train_No': '#E4B66B','Mach_1': '#00584D', }

第三部分

# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def create_plot(df, n, scheme_id=1, ring_thickness=0.8, ring_gap=0.2):colors = color_schemes.get(scheme_id, color_schemes[1]) #提取配色方案#创建画布fig = plt.figure(figsize=(14, 14), facecolor='white')ax = fig.add_axes([0, 0, 1, 1]) #添加轴ax.set_aspect('equal') #设置x轴和y轴的比例一致ax.axis('off') #关闭坐标轴线条、刻度和标签total_radians = 1.5 * np.pi #圆环站的角度d_theta = total_radians / n #每个样本的角度区间大小thetas = np.linspace(np.pi / 2 - d_theta / 2, -np.pi + d_theta / 2, n) #所有样本中心角度

第四部分

#扇形色块的绘制函数def draw_wedge(ax, r_in, r_out, t_start, t_end, color):ax.fill(x, #xy, #ycolor=color, #填颜色edgecolor='black', #边框色lw=0.3) #边框线宽draw_wedge(ax, rings['Machines'][0], rings['Machines'][1], t_start, t_end, m_col)t_col = colors['Train_Yes'] if df['Training'].iloc[i] == 1 else colors['Train_No'] #映射颜色#绘制第二层扇形色块draw_wedge(ax, rings['Training'][0], rings['Training'][1], t_start, t_end, t_col)

第五部分

#遍历外层火柴棒环名称、数据列名、数据范围和刻度信息for ring_name, data_col, v_lims, ring_ticks in zip(['Area', 'Education', 'Age'], #圆环名['Area', 'Education', 'Age'], #数据列名[(0, 1.5), (-2, 17), (20, 80)], #数据范围#刻度值[[0.3, 0.6, 1.0, 1.3],[0, 5, 10, 15],[30, 50, 70]]):ax.plot(x_box, #xy_box, #ycolor='black', #颜色lw=0.6, #线宽zorder=0) #层val = df[data_col].iloc[i] #提取当前样本在该指标下的具体数值r_val = r_in + (val - v_lims[0]) / (v_lims[1] - v_lims[0]) * (r_out - r_in) #将该数值映射到该圆环内的特定半径上#绘制火柴棒线部分ax.plot([r_in * np.cos(t_center), r_val * np.cos(t_center)], #x[r_in * np.sin(t_center), r_val * np.sin(t_center)], #ycolor=colors[ring_name], #颜色lw=1.5, #线宽zorder=1) #层#点部分ax.plot(r_val * np.cos(t_center), #xr_val * np.sin(t_center), #y'o', #样式color=colors[ring_name], #颜色markersize=4, #大小zorder=2) #层

第六部分

text_radius = rings['Age'][1] + 0.4 #外圈文本标注半径#遍历所有样本数据添加ID文本ax.text(x_text, #xy_text, #ystr(df['ID'].iloc[i]), #文本rotation=rot_deg, #旋转ha='center', #水平va='center', #垂直fontsize=13) #字体大小

第七部分

#箱型图和散点图组合图绘制函数def create_vertical_swarm(ax_sub, data, color, title, unit, ylim, ticks):ax_sub.set_ylim(ylim) #y轴范围#标题ax_sub.set_title(f"{title}\n({unit})",fontsize=16,pad=10)ax_sub.set_xticks([]) #隐藏x轴刻度ax_sub.set_yticks([]) #隐藏y轴刻度ax_sub.set_ylabel('') #y轴标题#设置边框for spine in ax_sub.spines.values():spine.set_color('gray') #颜色spine.set_linewidth(0.5) #宽度zorder=3, #层#背景框属性bbox=dict(facecolor='#6d6a5d', #背景颜色edgecolor='none', #背景框线pad=1.5, #背景框的内边距alpha=0.8)) #透明度#创建Age箱线图轴ax_age = ax.inset_axes([-rings['Age'][1], #x0.2, #yring_thickness, 8.0], #宽度高度transform=ax.transData) #坐标系#绘制create_vertical_swarm(ax_age, #轴df['Age'], #数据colors['Age'], #颜色'Age', #标题'years', #单位[20, 80], #y轴范围[30, 40, 50, 60, 70]) #刻度#Educationax_edu = ax.inset_axes([-rings['Education'][1], 0.2, ring_thickness,8.0],transform=ax.transData)create_vertical_swarm(ax_edu, df['Education'],colors['Education'], 'Education', 'years',[-2, 17],[0, 5, 10, 15])ax_area = ax.inset_axes([-rings['Area'][1],0.2,ring_thickness, 8.0],transform=ax.transData)create_vertical_swarm(ax_area,df['Area'],colors['Area'], 'Area','ha', [0, 1.5],[0.3, 0.6, 1.0, 1.3])

第八部分

ax_train = ax.inset_axes([-rings['Training'][1],0.2, ring_thickness,8.0],transform=ax.transData)train_counts = df['Training'].value_counts(normalize=True) * 100 #转换为百分数t_0 = train_counts.get(0, 0) #0的百分比t_1 = train_counts.get(1, 0) #1的百分比if t_1 > 5:ax_train.text(0, #xt_0 + t_1 / 2, #yf"{t_1:.1f}", #文本ha='center', #水平va='center', #垂直color='white', #颜色fontsize=16) #大小#标题ax_train.set_title("Training(%)", #文本rotation=45, #旋转ha='left', #水平y=1.02, #yfontsize=16) #大小ax_train.axis('off') #去掉边框与轴线ax_train.set_ylim(0, 100) #y轴范围#插入子图轴ax_mach = ax.inset_axes([-rings['Machines'][1], 0.2, ring_thickness, 8.0], transform=ax.transData)mach_counts = df['Machines'].value_counts(normalize=True) * 100 #百分比btm += p #更新#标题ax_mach.set_title("Machines(%)", #文本rotation=45, #旋转ha='left', #水平y=1.02, #yfontsize=16) #大小ax_mach.axis('off') #去掉边框、坐标刻度ax_mach.set_ylim(0, 100) #y轴范围

第九部分

ax_leg = ax.inset_axes([-1.8, -1.5, 3.6, 3.0], transform=ax.transData) #图例轴ax_leg.axis('off') #去掉轴显示ax_leg.set_xlim(0, 3.6) #x范围ax_leg.set_ylim(0, 3.0) #y范围 facecolor=colors['Age'])) #填充色#ax_leg.text(0.4, #x2.7, #y'Age', #文本va='center', #垂直fontsize=14) #大小ax_leg.add_patch(Rectangle((0.0, 1.0),w,h, facecolor=colors['Train_No']))ax_leg.text(0.4,1.1,'0',va='center',fontsize=14)ax_leg.text(1.4,2.0,'Machines',va='center',fontsize=14)#配置颜色m_list = [colors['Mach_1'],colors['Mach_2'],colors['Mach_3'],colors['Mach_4'],]

第十部分

# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == "__main__":RING_THICKNESS = 1.3 #圆环厚度RING_GAP = 0.2 #圆环间隔df_real_data = pd.read_excel(r'data.xlsx') #读取数据n = len(df_real_data) #样本数用于划分圆环区域#设置是否批量绘图plot_all = Trueif plot_all:for i in color_schemes.keys():create_plot(df_real_data, n, scheme_id=i, ring_thickness=RING_THICKNESS,ring_gap=RING_GAP)else:TARGET_SCHEME = 1create_plot(df_real_data, n, scheme_id=TARGET_SCHEME, ring_thickness=RING_THICKNESS,ring_gap=RING_GAP)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
df_real_data = pd.read_excel(r'data.xlsx') #读取数据2.提取热图部分数据映射颜色,绘图函数部分:
m_col = [colors['Mach_1'], colors['Mach_2'], colors['Mach_3'], colors['Mach_4']][df['Machines'].iloc[i] - 1] 3.定义连续型数据列名,绘图函数部分:
['Area', 'Education', 'Age'], #数据列名4.定义绘图结果的保存地址,绘图函数部分:
plt.savefig(fr'plot_{scheme_id}.png', dpi=300,bbox_inches='tight')
推荐


获取方式
