
代码绘制成果展示






代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport matplotlib.patches as patchesimport matplotlib.patheffects as peimport matplotlibimport pandas as pd

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#5ca2fb', '#8ec3a5', '#ff9f9b', '#abe5ea', '#fdf6c2', '#c9cbfd', '#bae8ca', '#02ba6f', '#ff9999', '#99ccff'],}SCHEME_ID = 59 #配色方案colors = COLOR_SCHEMES[SCHEME_ID] #提取配色STYLE_ID = 3 #样式

第三部分

。创造了一个立体的多层阴影特效。它通过叠加三层不断偏移且透明度依次递减的灰色块,最后再把本体画在最上面,模拟出了平滑的 3D 卡通投影效果。遍历待绘制的数据,动态计算出当前柱子的 X 坐标、高度,并按顺序循环获取当前柱子对应的填充颜色。# =========================================================================================# ======================================4.绘图函数======================================# =========================================================================================def draw_cartoon_policy_chart():BG_COLOR = '#ffffff' #背景颜色#创建画布fig, ax = plt.subplots(figsize=(15, 8.5))fig.patch.set_facecolor(BG_COLOR) #设置图形对象的背景颜色ax.set_facecolor(BG_COLOR) #设置坐标系内部区域的背景颜色WIDTH = 0.75 #柱子的宽度ASPECT = 15.0 #设置绘制圆角矩形时的形变宽高比MAX_HEIGHT = 150 # 设定背景外框的最大固定高度#图形对象的路径特效列表,用于生成具有立体感的渐变实体阴影solid_shadow_effects = [# 添加第一层阴影pe.SimplePatchShadow(offset=(0, -1.5), #偏移shadow_rgbFace='#909fa6', #阴影填充颜色alpha=0.15), #透明度# 添加第二层阴影pe.SimplePatchShadow(offset=(1.5, -3.0), #偏移shadow_rgbFace='#909fa6', #阴影填充颜色alpha=0.1), #透明度# 添加第三层阴影pe.SimplePatchShadow(offset=(3.0, -4.5), #偏移shadow_rgbFace='#909fa6', #阴影填充颜色alpha=0.05), #透明度pe.Normal() # 在阴影层上方叠加原本正常的图形]#遍历柱状图数据for i, block inenumerate(bars_data):bottom = 0 # 柱形图的起始Y坐标x = x_positions[i] #取出当前这一列应该放置的X轴中心坐标h = block['h'] #读取当前柱子所代表的数据高度c = colors[i % len(colors)] #循环提取配色方案中的颜色分配给当前柱子

第四部分


# 判定如果当前选择的是样式1if STYLE_ID == 1:# 将定义好的立体阴影特效赋予该对象p.set_path_effects(solid_shadow_effects)ax.add_patch(p) #添加到坐标系#X坐标文本ax.text(x, #Xh + 4, #Ystr(h), #高度数值ha='center', #水平va='bottom', #垂直fontsize=18, #字体大小fontweight='bold', #粗体color='#333', #字体颜色)

第五部分


#样式2elif STYLE_ID == 2:#绘制第一个作为阴影底层的虚线圆角矩形ax.add_patch(patches.FancyBboxPatch((x - WIDTH / 2 + 0.06, #左下角X坐标bottom - 1.0), # 左下角Y坐标WIDTH, # 宽度h, # 高度boxstyle="round,pad=0,rounding_size=0.15", #圆角mutation_aspect=ASPECT, # 形变比例facecolor='none', #填充色edgecolor='#909fa6', #边框颜色linestyle='--', #样式linewidth=3.5, #线宽alpha=0.25, #透明度zorder=1 #层级))#添加文本ax.text(x, #xh + 4, # 高度str(h), #高度标注ha='center', # 水平va='bottom', # 垂直fontsize=18, #字体大小fontweight='bold', #加粗color='#333', #颜色)

第六部分


#样式3elif STYLE_ID == 3:#画出容量槽的内测白边底框ax.add_patch(patches.FancyBboxPatch((x - WIDTH / 2, bottom), #坐标WIDTH, #宽度MAX_HEIGHT, #高度boxstyle="round,pad=0,rounding_size=0.15", #圆角设定mutation_aspect=ASPECT, #形变比例facecolor='none', # 空心edgecolor='white', # 边颜色linewidth=5.5, #线粗zorder=2 #层级))# 中心文字ax.text(x,#xMAX_HEIGHT / 2, #Ystr(h), #数值ha='center', #水平va='center', # 垂直fontsize=18, #字体大小fontweight='bold', #加粗color='red', #数字颜色#添加一个圆形的背景bbox=dict(boxstyle="circle,pad=0.3", #圆形,内外间距facecolor="white", #填满色edgecolor="black", #边线颜色linewidth=1.5), #边线宽度zorder=10) #层级

第七部分

ax.axis('off') #隐藏默认生成的坐标轴与刻度max_x = max(x_positions) if x_positions else 15 # 获取当前X轴最右端坐标rect_width = max_x + 2.5 #外框的总宽度#外围虚线框rect = patches.Rectangle((-1.2, -20), #坐标rect_width, #矩形宽度205, #高度fill=False, #填充色edgecolor='#cccccc', #边线色linestyle='--', #虚线linewidth=2, # 线宽zorder=0) #层ax.add_patch(rect) #添加#绘制主标题ax.text((max_x - 2.5) / 2 + 1, #X172, #y"Policy Analysis Chart", #文本内容ha='center', #水平va='center', #垂直fontsize=28, #字体大小color='#111', # 颜色fontweight='bold', #加粗)#y轴标题ax.text(-0.5, #x75, #y"Effect Score", # #文本内容rotation=90, #旋转ha='center', #水平va='center', #垂直fontsize=22, #字体大小color='#444', # 颜色fontweight='bold', #加粗)

第八部分

# =========================================================================================# ======================================4.执行部分======================================# =========================================================================================if __name__ == '__main__':excel_filename = r'data.xlsx' #原始数据路径df_data = pd.read_excel(excel_filename) #读取数据labels_x = df_data['X'].tolist() #提取X轴数据bars_data = [{'h': val} for val in df_data['Y'].tolist()] # 提取y轴数值x_positions = [1.5 * i for i in range(1, len(labels_x) + 1)] #生成均匀递增坐标点数组,供每一根柱子排位使用# 调用绘图函数draw_cartoon_policy_chart()

如何应用到你自己的数据

1.设置配色方案:
SCHEME_ID = 59 #配色方案2.设置绘图风格:
STYLE_ID = 3 #样式3.设置绘图结果的保存地址:
png_filename = fr'scheme_{SCHEME_ID}_style_{STYLE_ID}.png'4.设置原始数据文件的保存地址:
excel_filename = r'data.xlsx' #原始数据路径5.提取X轴的数据:
labels_x = df_data['X'].tolist() #提取X轴数据6.提取Y轴的数据:
bars_data = [{'h': val} for val in df_data['Y'].tolist()] # 提取y轴数值
推荐


获取方式
