用matplotlib散點圖用餅圖示記

cottpaddedC發表於2020-12-20

本章博文看完你能夠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】獲取
在這裡插入圖片描述

相關文章