用matplotlib散点图用饼图标记

本章博文看完你能够get到什么:
用matplotlib画出漂亮pie-chart 图
以及matplotlob相关的画图函数

我们要实现的目标:

在这里插入图片描述

问题引入

如果我们在一张数据表中,有那么三列数据(学生性别,学生类型,学生发色),若是让你去分析这样子的三列数据的话,其中学生性别(男,女),学生类型(初中生,高中生,大学生,研究生,博士生),学生发色(红,白,黄,绿。黑。。),若是让你去可视化这样子的散列数据之间的关系,你会怎么做?
答:这样子的话其实可视化的方法有很多种,这里就介绍一种pie-scatter的方法吧当然可以画3D图

代码

首先我们要定义一个函数,一个让我们传数据(饼图的大小,饼图的占比,以及饼图的分布)的函数,

# xs,ys是我们传进来的x 和y值,ratio指的是我们的占有率(打个比方男的70%,女的30%),sizes指的是这个点的大小,ax是画图函数
def drawPieMarker(xs, ys, ratios, sizes, colors, ax):
    markers = []
    previous = 0
    # calculate the points of the pie pieces
    for color, ratio in zip(colors, ratios):
        this = 2 * np.pi * ratio + previous
        x  = [0] + np.cos(np.linspace(previous, this, 30)).tolist() + [0]
​
        y  = [0] + np.sin(np.linspace(previous, this, 30)).tolist() + [0]
​
        xy = np.column_stack([x, y])
        previous = this
        markers.append({'marker':xy, 's':np.abs(xy).max()**2*np.array(sizes), 'facecolor':color})# scatter each of the pie pieces to create piesggg
    for marker in markers:
        ax.scatter(xs, ys, **marker, alpha=0.7)

上面的代码是我在一个官网找的,https://matplotlib.org/gallery/lines_bars_and_markers/scatter_piecharts.html#sphx-glr-gallery-lines-bars-and-markers-scatter-piecharts-py
我们随便的测试下

fig,ax = plt.subplots()
drawPieMarker([1,2,3],[1,2,3],[0.3,0.7],[300],['#004c70', '#990000'],ax)

在这里插入图片描述
上面那个定义的函数的具体是怎么实现的我就不详细介绍了
接下来就是准备数据的阶段:
在这里插入图片描述

q3_order = ['Man', 'Woman', 'unknow']
q5_order = ['Business Analyst'
 ,'Data Analyst'
 ,'Data Engineer'
 ,'Data Scientist'
 ,'DBA/Database Engineer'
 ,'Machine Learning Engineer'
 ,'Product/Project Manager'
 ,'Research Scientist'
 ,'Software Engineer'
 ,'Statistician'
 ,'Student'
 ,'Currently not employed'
 ,'Other']
q15_order = [
    'I do not use machine learning methods'
    ,'Under 1 year'
    ,'1-2 years'
    ,'2-3 years'
    ,'3-4 years'
    ,'4-5 years'
    ,'5-10 years'
    ,'10-20 years'
    ,'20 or more years']

接下来就是对数据进行处理的过程(作三种透视表)
包括男和女的在内的Q5,Q15的数据透视表

在这里插入图片描述
在男的范围内的Q5Q15的数据透视表在这里插入图片描述
在女的范围内的Q5Q15的数据透视表:
在这里插入图片描述

画出饼点图

fig = plt.figure(figsize=(20, 23), dpi=200)

gs = fig.add_gridspec(5, 5)



ax_plot = fig.add_subplot(gs[1:4, 0:4]) 
for q5_idx in q5_order[::-1]:
    for q15_idx in q15_order:
        man = data_Q2Q15_man[q5_idx][q15_idx]
        woman = data_Q2Q15_woman[q5_idx][q15_idx]
        tot = data_Q5Q15[q5_idx][q15_idx]
        drawPieMarker([q15_idx],[q5_idx], [man/(man+woman), woman/(man+woman)] ,[tot*2.5], ['#004c70', '#990000'], ax=ax_plot)

ax_plot.grid(linewidth=0.2, zorder=0)        

ax_plot.set_yticklabels(q5_idx, fontfamily='serif', fontsize=15)
ax_plot.set_xticklabels(q15_idx, fontfamily='serif', fontsize=15, rotation=90)

在这里插入图片描述
我们就可以画出我们要的饼点,大小根据我们数目的大小,饼点是根据男女进行划分,
画出上面的bar图

# Pos
ax_pos = fig.add_subplot(gs[0, :4], sharex=ax_plot) 
data_q15_woman = data[data['Q2']=='Woman']['Q15'].value_counts()[q15_order]
ax_pos.bar(data_q15_woman.index, data_q15_woman, width=0.45, alpha=0.7, color='#990000')

data_q15_man = data[data['Q2']=='Man']['Q15'].value_counts()[q15_order]
ax_pos.bar(data_q15_man.index, data_q15_man, bottom=data_q15_woman , width=0.45, alpha=0.7, color='#004c70')

plt.setp(ax_pos.get_xticklabels(), visible=False)

在这里插入图片描述

画出右侧的bar图

# ext
ax_exp = fig.add_subplot(gs[1:4, 4], sharey=ax_plot) 

data_q5_woman = data[data['Q2']=='Woman']['Q5'].value_counts()[q5_order]
ax_exp.barh(data_q5_woman.index[::-1], data_q5_woman[::-1], height=0.55, alpha=0.7, color='#990000')

data_q5_man = data[data['Q2']=='Man']['Q5'].value_counts()[q5_order]
ax_exp.barh(data_q5_man.index[::-1], data_q5_man[::-1], left= data_q5_woman[::-1],height=0.55, alpha=0.7, color='#004c70')

plt.setp(ax_exp.get_yticklabels(), visible=False)


'''for s in ['top', 'left', 'right', 'bottom']:
    ax_plot.spines[s].set_visible(False)
    ax_pos.spines[s].set_visible(False)
    ax_exp.spines[s].set_visible(False)'''
    

fig.text(0.8, 0.9, 'Gender & Position & ML Experience', fontweight='bold', fontfamily='serif', fontsize=35, ha='right') 
fig.text(0.8, 0.88, 'Stacked Bar Chart + Categorical Bubble Pie Chart', fontweight='light', fontfamily='serif', fontsize=20, ha='right')
# plt.tight_layout()
plt.show()

在这里插入图片描述

代码说明:
代码来自于一个大佬的博客,侵删
若是需要源代码:
若是对代码有想法的可以关注下公众号 输入【matplotlib_001】获取
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页