如何用Python繪製百分比堆疊橫條圖

閱讀時間約 6 分鐘

首先我們的資料如下

import pandas as pd
data = pd.read_excel("rawdata.xlsx")
raw-image

接著我們要將我們的資料,整理成方便我們繪圖的DataFrame

#先建立一個要存放我們繪圖要使用的DataFrame
dataFinal = pd.DataFrame()
dataFinal["量度"]=["非常不同意","不同意","普通","同意","非常同意"]

#將我們要繪製的每一題做一個迴圈,去計算它們的百分比值
for i in ["學習狀況良好","體育狀況良好","人際狀況良好"]:

    #建立一個樞紐分析表,去紀錄各量度的個數
    dataPvt = data[[i,"姓名"]].pivot_table(index=i,aggfunc="count").reset_index()
    dataPvt.rename(columns={i:"量度"},inplace=True)

    #寫一個轉換函數,建立一個排序值的欄位,以此進行排序
    def word2num(x):
        if x == "非常同意": return 5
        elif x == "同意": return 4
        elif x == "普通": return 3
        elif x == "不同意": return 2
        elif x == "非常不同意": return 1
    dataPvt["排序值"] = list(map(lambda x : word2num(x),dataPvt["量度"]))
    dataPvt.sort_values(by="排序值",inplace=True)

    #建立一個百分比值的欄位
    dataPvt[i] = list(map(lambda x: ((x/dataPvt["姓名"].sum())*100),dataPvt["姓名"]))

    #將百分比值欄位添加進繪圖要使用的DataFrame
    dataFinal[i] = dataPvt[i]

#將DataFrame中的遺漏值補為0
dataFinal.fillna(0,inplace=True)
raw-image

有了這樣的資料,我們就可以開始繪製百分比堆疊直條圖了:

import matplotlib

#選擇中文字體
matplotlib.rc("font",family="Microsoft YaHei")

from matplotlib import pyplot as plt

#繪製圖的大小
plt.figure(figsize=(8,4))

#繪製一個位於包含1X1個子圖的圖且位置在(0,0)的子圖
ax0 = plt.subplot2grid((1,1),(0,0),colspan=1,rowspan=1)

#--------------------------------

#建立x軸資料
ax0_x = dataFinal.columns.values.tolist()
ax0_x.remove("量度")

#建立h軸資料來源(因為我們從中取出不同的資料作堆疊)
ax0_h_source = dataFinal.drop(columns="量度")

#建立稍候迴圈堆疊時會用到的變數
start = 0
colorList = ["darkred","red","darkgray","green","darkgreen"]

#--------------------------------

#開始繪製Bar
for i, color_value, label_value in zip(range(0,5),colorList,["非常不同意","不同意","普通","同意","非常同意"]):
    #從h軸資料來源中取出1行作為h軸資料
    ax0_h = ax0_h_source.loc[i]
    #left是指起始位置,讓它從0開始
    ax0.barh(ax0_x,ax0_h,height=0.5,left=start,color=color_value,label=label_value)
    #讓下一次繪圖時的起始值,加上這次h的值,以此做堆疊
    start = start + ax0_h
    #利用迴圈,加上數值資訊
    for k,r,j in zip(start,range(0,len(list(ax0_x))),ax0_h):
        if j!=0:
            ax0.text(k-j/2, r, str(round(j)) + "%", color="white", horizontalalignment="center",verticalalignment="center",fontsize=10)
        elif j == 0:
            ax0.text(k-j/2, r, "", color="white", horizontalalignment="center",verticalalignment="center",fontsize=10)

#--------------------------------

#讓x軸座標與刻度不顯現
ax0.set_xticklabels([])
ax0.set_xticks([])

#建立圖例資訊
ax0.legend(ncols=5, loc="lower center",bbox_to_anchor=(0.5,-0.15))

#建立標題
plt.title("百分比堆疊直條圖")    
raw-image



4會員
60內容數
我是果農,這裡有我的人資職涯經驗分享,與我菜鳥般的Python資料分析筆記,還有一些讀書心得,希望對大家有幫助。
留言0
查看全部
發表第一個留言支持創作者!
果農的沙龍 的其他內容
透過分析臺灣好行的公開資料,分享如何用Python繪製折線圖
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
本文介紹瞭如何使用 Python pandas 進行資料分析,包括如何使用 corr() 函數針對數字類型的欄位進行分析,以及如何刪除不需要的欄位和取得想要的小數位數。
如何用Python匯入大批Excel檔案? os.listdir建立資料夾內[檔案名稱.副檔名]之列表 利用迴圈將所有檔案匯入Python 用pandas.concat合併所有DataFrame
如何用Python為某欄做分類,例如:判斷分數是否及格 
透過分析臺灣好行的公開資料,分享如何用Python繪製折線圖
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
本文介紹瞭如何使用 Python pandas 進行資料分析,包括如何使用 corr() 函數針對數字類型的欄位進行分析,以及如何刪除不需要的欄位和取得想要的小數位數。
如何用Python匯入大批Excel檔案? os.listdir建立資料夾內[檔案名稱.副檔名]之列表 利用迴圈將所有檔案匯入Python 用pandas.concat合併所有DataFrame
如何用Python為某欄做分類,例如:判斷分數是否及格 
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
根據RFM的資料來分成8種類型的客戶,1.重要價值客戶2.重要保持客戶3.重要發展客戶4.一般發展客戶5.重要挽留客戶6.一般價值客戶7.一般保持客戶8.一般挽留客戶
Thumbnail
RFM模型是最基本的分析,可以讓你知道哪些是常客、哪些人是偶爾來一次,或是根本不常來,藉此針對不同的客群去做不同的策略,達到提升業績的方法。接下來就讓我教你如何運用PYTHON快速做出RFM分析
Thumbnail
如何用門檻高低來找到有價值的能力? 以前門檻很高的事情,你因為現在門檻變低而過了,並不代表你有那個能力。 用大學文憑來比喻,50 年前要考上大學,除了要考上之外,你的家境還要有足夠的錢,且有能讓你讀書的時間才可以上大學。 所以那時候你能上大學的話,代表你身分地位是很高的,也容易吸引女人過來。 但你如
Thumbnail
你也曾想過用直式的編排,在方格子寫下自己的新詩與散文嗎?古板的我,明知道閱讀的是網路文章,還是有想要閱讀直式排版的時候。尤其是讀到很棒的詩與散文,會開始意淫如果是直式排版(像看書本一樣),那會是什麼樣的氣質?閒人如我,在使用方格子編輯器一年多後,試著將不輕不重的小文字,編排成直式閱讀的文章。
Thumbnail
想當初備考的時候很希望可以參考多一點備考心得,所以現在考上了也想上來分享我的備考方式~
Thumbnail
這次的方格子是要教各位,如何用Notion來記錄自己的閱讀進度。 上次介紹了怎麼建造美麗的書櫃時,大家看到我多得嚇死人的標籤應該嚇壞了,這次來介紹上次沒有提到的標籤屬性部分。  左邊則是這一次要教大家怎麼做的打卡部分,右邊的資料庫則是上一次給大家看的書櫃,同一個資料庫但是不同的顯示方法。 
Thumbnail
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
根據RFM的資料來分成8種類型的客戶,1.重要價值客戶2.重要保持客戶3.重要發展客戶4.一般發展客戶5.重要挽留客戶6.一般價值客戶7.一般保持客戶8.一般挽留客戶
Thumbnail
RFM模型是最基本的分析,可以讓你知道哪些是常客、哪些人是偶爾來一次,或是根本不常來,藉此針對不同的客群去做不同的策略,達到提升業績的方法。接下來就讓我教你如何運用PYTHON快速做出RFM分析
Thumbnail
如何用門檻高低來找到有價值的能力? 以前門檻很高的事情,你因為現在門檻變低而過了,並不代表你有那個能力。 用大學文憑來比喻,50 年前要考上大學,除了要考上之外,你的家境還要有足夠的錢,且有能讓你讀書的時間才可以上大學。 所以那時候你能上大學的話,代表你身分地位是很高的,也容易吸引女人過來。 但你如
Thumbnail
你也曾想過用直式的編排,在方格子寫下自己的新詩與散文嗎?古板的我,明知道閱讀的是網路文章,還是有想要閱讀直式排版的時候。尤其是讀到很棒的詩與散文,會開始意淫如果是直式排版(像看書本一樣),那會是什麼樣的氣質?閒人如我,在使用方格子編輯器一年多後,試著將不輕不重的小文字,編排成直式閱讀的文章。
Thumbnail
想當初備考的時候很希望可以參考多一點備考心得,所以現在考上了也想上來分享我的備考方式~
Thumbnail
這次的方格子是要教各位,如何用Notion來記錄自己的閱讀進度。 上次介紹了怎麼建造美麗的書櫃時,大家看到我多得嚇死人的標籤應該嚇壞了,這次來介紹上次沒有提到的標籤屬性部分。  左邊則是這一次要教大家怎麼做的打卡部分,右邊的資料庫則是上一次給大家看的書櫃,同一個資料庫但是不同的顯示方法。 
Thumbnail
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html: