
代码绘制成果展示












代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport pandas as pdfrom matplotlib.patches import Polygonimport matplotlibplt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = ['Times New Roman']plt.rcParams['axes.unicode_minus'] = Falsematplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42plt.rcParams['axes.labelweight'] = 'bold'

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'good_dot': '#6BAED6', 'good_poly': '#B5D7EB', 'bad_dot': '#F07B7B', 'bad_poly': '#F8BDBD'},}

第三部分

# =========================================================================================# ======================================2.哑铃图主绘图函数=======================================# =========================================================================================def plot_dumbbell_chart(df):#创建画布fig, (ax1, ax_text, ax2) = plt.subplots(1, #行多3, # 列figsize=(14, 10), # 大小sharey=True, #共享相同的Y轴范围及比例gridspec_kw={'width_ratios': [1, 0.15, 1], #三个子图的宽度'wspace': 0.0}) #子图之间的水平间距y_limits = (-1, len(df)) #计算Y轴的上下限ax1.set_ylim(y_limits) #应用到左侧子图ax_text.set_ylim(y_limits) #应用到中间子图ax2.set_ylim(y_limits) #应用到右侧子图#中间文字ax_text.text(0.5, #xi, #yrow['Country'], #文本内容ha='center', #水平va='center', #垂直fontsize=12, #大小fontweight='bold', #加粗color='black') #颜色

第四部分

ax1.set_xlim(65, 15) #设置左侧图的X范围ax1.set_xticks([60, 50, 40, 30, 20]) #自定义x刻度值位置#左侧子图x轴标题ax1.set_xlabel('Gini index of disposable income (%)',fontsize=13,loc='left')ax2.set_xlim(0, 35000) #设置右侧图的X范围ax2.set_xticks([0, 10000, 20000, 30000]) #自定义右侧x刻度值位置ax2.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: format(int(x), ','))) #格式化右侧数值添加千分位逗号#右侧子图x轴标题ax2.set_xlabel('Per-capita real GDP (2017 US$)', fontsize=13, loc='left')#网格线ax.grid(axis='x', #X轴color='lightgray', #颜色设linestyle='-', #样式linewidth=0.5, #粗细zorder=0) #层#关闭中间子图区域的全部坐标轴及外框线ax_text.axis('off')#调整全图与画板边缘plt.subplots_adjust(left=0.05, #左right=0.8, #右bottom=0.1, #底top=0.95) # 上

第五部分

#图例坐标区域ax_leg = fig.add_axes([0.77, 0.22, 0.17, 0.21])ax_leg.set_xlim(0, 10) #x范围ax_leg.set_ylim(0, 10) #y范围#去掉轴刻度ax_leg.set_xticks([])ax_leg.set_yticks([])#遍历图例边框线for spine in ax_leg.spines.values():spine.set_edgecolor('black') #颜色spine.set_linewidth(2.0) #粗细y_c, #ys=200, #大小color='#A9A9A9', #颜色zorder=3) #层#图例右侧点ax_leg.scatter(7.5, #xy_c, #ys=30, #大小color='#A9A9A9', #颜色zorder=3) #层ax_leg.text(0.1, #x4.2, #y'increasing Gini or decreasing\n per-capita GDP', #文本内容color=colors['bad_dot'], #颜色fontsize=13, #大小va='center', #垂直fontweight='bold') #加粗

第六部分

# =========================================================================================# ======================================5.执行部分=======================================# =========================================================================================if __name__ == '__main__':df_plot = pd.read_excel(r'data.xlsx') #原始数据路径#绘图plot_dumbbell_chart(df_plot)

如何应用到你自己的数据

1.设置配色方案:
scheme_id = 60 #要用的配色方案2.设置绘图结果的保存地址:
plt.savefig(fr'dumbbell_chart{scheme_id}.png', dpi=300, bbox_inches='tight')3.设置原始数据的文件路径:
df_plot = pd.read_excel(r'data.xlsx') #原始数据路径4.提取数据进行对比,用于确定颜色和点的大小:
df_plot['gini_is_good'] = df_plot['Gini_2018'] < df_plot['Gini_1990']df_plot['gdp_is_good'] = df_plot['GDP_2018'] > df_plot['GDP_1990']

推荐


获取方式
