python繪制圖
如何用python繪制圖表
摘要: 使用python繪制簡單的圖表,包括折線圖、柱狀圖、條形圖、餅圖、散點圖、氣泡圖、箱線圖、直方圖等。
前言
本文介紹如果使用python匯總常用的圖表,與Excel的點選操作相比,用python繪制圖表顯得比較比較繁瑣,尤其提現在對原始數據的處理上。但兩者在繪制圖表過程中的思路大致相同,Excel中能完成的工作python大多也能做到。為了能夠更好使用python繪制圖表,我們需要導入幾個 Python 的基本軟件包NumPy,Pandas,matplotlib。
NumPy 是用於科學計算與 Python 的基本軟件包。它包含除其他外:
一個強大的 N 維數組對象
復雜的 (廣播) 功能
為集成 C/c + + 和 Fortran 代碼工具
有用的線性代數、 傅裏葉變換和隨機編號功能
除了其明顯的科學用途,NumPy 也可以用作泛型數據高效多維容器。可以定義任意數據類型。這允許 NumPy 迅速、 無縫集成與各種各樣的數據庫。
Pandas 是連接 SciPy 和 NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。Comma-separated values (CSV) 文件表示在有關各方之間分發數據的最常見的方法之一。Pandas 提供了一種優化庫功能來讀寫多種文件格式,包括 CSV 和高效的 HDF5 格式。
Matplotlib是一個Python的圖形框架,類似於MATLAB和R語言。
在使用NumPy進行學習統計計算時是枯燥的,大量的數據令我們很頭疼,所以我們需要把它圖形化顯示。
接下來我們進行實戰
1,數據如下
issue_d | member_id | loan_amnt | term | grade | emp_length | annual_inc | loan_status | total_pymnt_inv | total_rec_int |
2016/6/16 | 1296599 | 5000 | 36 months | B | 10+ years | 24000 | Fully Paid | 5833.84 | 863.16 |
2016/9/13 | 1314167 | 2500 | 60 months | C | < 1 year | 30000 | Charged Off | 1008.71 | 435.17 |
2016/6/16 | 1313524 | 2400 | 36 months | C | 10+ years | 12252 | Fully Paid | 3005.67 | 605.67 |
2016/4/16 | 1277178 | 10000 | 36 months | C | 10+ years | 49200 | Fully Paid | 12231.89 | 2214.92 |
2016/6/16 | 1311748 | 3000 | 60 months | B | 1 year | 80000 | Current | 3581.12 | 1042.85 |
2016/1/16 | 1311441 | 5000 | 36 months | A | 3 years | 36000 | Fully Paid | 5632.21 | 632.21 |
2016/5/16 | 1304742 | 7000 | 60 months | C | 8 years | 47004 | Fully Paid | 10137.84 | 3137.84 |
######## | 1288686 | 3000 | 36 months | E | 9 years | 48000 | Fully Paid | 3939.14 | 939.14 |
2016/8/12 | 1306957 | 5600 | 60 months | F | 4 years | 40000 | Charged Off | 646.02 | 294.94 |
2016/3/13 | 1306721 | 5375 | 60 months | B | < 1 year | 15000 | Charged Off | 1469.34 | 533.42 |
######## | 1305201 | 6500 | 60 months | C | 5 years | 72000 | Fully Paid | 7678.02 | 1178.02 |
2016/8/13 | 1305008 | 12000 | 36 months | B | 10+ years | 75000 | Fully Paid | 13947.99 | 1947.99 |
######## | 1298717 | 9000 | 36 months | C | < 1 year | 30000 | Charged Off | 2270.7 | 570.26 |
2016/6/16 | 1304956 | 3000 | 36 months | B | 3 years | 15000 | Fully Paid | 3480.27 | 480.27 |
2016/6/17 | 140597 | 4000 | 12 months | D | 1 year | 10000 | Charged Off | 1200.02 | 500 |
1,圓形圖
# coding=utf-8 __author__ = ‘Jay‘ import pandas as pd # 導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘] = False # 用控制中文亂碼 loandata = pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) # 按用戶等級grade字段對貸款金額進行求和匯總 loan_grade = loandata.groupby(‘grade‘)[‘loan_amnt‘].agg(sum) # 設置餅圖中每個數據分類的顏色 colors = ["#99CC01", "#FFFF01", "#0000FE", "#FE0000", "#A6A6A6", "#D9E021"] # 設置餅圖中每個數據分類的名稱 name = [u‘A級‘, u‘B級‘, u‘C級‘, u‘D級‘, u‘E級‘, u‘F級‘] # 創建餅圖,設置分類標簽,顏色和圖表起始位置等, # labels (每一塊)餅圖外側顯示的說明文字 # loan_grade (每一塊)的比例,如果sum(x) > 1會使用sum(x)歸一化 # explode (每一塊)離開中心距離 plt.pie(loan_grade, labels=name, colors=colors, explode=(0, 0, 0.1, 0, 0.1, 0), startangle=60, autopct=‘%1.1f%%‘) # 添加圖表標題 plt.title(u‘不同用戶等級的貸款金額占比‘) # 添加圖例,並設置顯示位置 plt.legend(name, loc=‘upper left‘) # 顯示圖表 plt.show()
2,條形圖
# coding=utf-8 # LOCALTION = [3, 4, 5, 6, 7, 8] __author__ = ‘Jay‘ import numpy as np import pandas as pd # 導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘] = False # 用控制中文亂碼 loandata = pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) # 按用戶等級grade字段對貸款金額進行求和匯總 loan_grade = loandata.groupby(‘grade‘)[‘loan_amnt‘].agg(sum) # 定義數據分類名稱 LOCALTIONS = [u‘A級‘, u‘B級‘, u‘C級‘, u‘D級‘, u‘E級‘, u‘F級‘] # 創建一個一維數組賦值給LOCALTION LOCALTION = np.arange(len(LOCALTIONS)) # 設置餅圖中每個數據分類的顏色 colors = ["#99CC01", "#FFFF01", "#0000FE", "#FE0000", "#A6A6A6", "#D9E021"] # a=np.array(LOCALTION) # 創建柱狀圖,數據源為按用戶等級匯總的貸款金額,設置顏色,透明度和外邊框顏色 plt.barh(LOCALTION, loan_grade, color=colors, alpha=0.8, align=‘center‘, edgecolor=‘white‘) # 設置x軸標簽 plt.ylabel(u‘用戶等級‘) # 設置y周標簽 plt.xlabel(u‘貸款金額‘) # 設置圖表標題 plt.title(u‘不同用戶等級的貸款金額分布‘) # 設置圖例的文字和在圖表中的位置 plt.legend([u‘貸款金額‘], loc=‘upper right‘) # 設置背景網格線的顏色,樣式,尺寸和透明度 plt.grid(color=‘#95a5a6‘, linestyle=‘--‘, linewidth=1, axis=‘y‘, alpha=0.4) # 設置數據分類名稱 plt.yticks(LOCALTION + 0.4, LOCALTIONS) # 顯示圖表 plt.show()
3.線箱圖
# coding=utf-8 __author__ = ‘Jay‘ import pandas as pd # 導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘] = False # 用控制中文亂碼 loandata = pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) # 創建箱線圖,數據源為貸款來源,設置橫向顯示 plt.boxplot(loandata[‘loan_amnt‘], 1, ‘rs‘, vert=False) # 添加x軸標題 plt.xlabel(u‘貸款金額‘) # 添加圖表標題 plt.title(u‘貸款金額分布‘) # 設置背景網格線的顏色,樣式,尺寸和透明度 plt.grid(color=‘#95a5a6‘, linestyle=‘--‘, linewidth=1, axis=‘both‘, alpha=0.4) # 顯示圖表 plt.show()
4.氣泡圖
# coding=utf-8 __author__ = ‘Jay‘ import pandas as pd # 導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘] = False # 用控制中文亂碼 loandata = pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) # 按月匯總貸款金額及利息 loan_x = loandata[‘loan_amnt‘] loan_y = loandata[‘total_rec_int‘] loan_z = loandata[‘total_rec_int‘] # 設置氣泡圖顏色 colors = ["#99CC01", "#FFFF01", "#0000FE", "#FE0000", "#A6A6A6", "#D9E021", ‘#FFF16E‘, ‘#0D8ECF‘, ‘#FA4D3D‘, ‘#D2D2D2‘, ‘#FFDE45‘, ‘#9b59b6‘] # 創建氣泡圖貸款金額為x,利息金額為y,同時設置利息金額為氣泡大小,並設置顏色透明度等。 plt.scatter(loan_x, loan_y, s=loan_z, color=colors, alpha=0.8) # 添加x軸標題 plt.xlabel(u‘貸款金額‘) # 添加y軸標題 plt.ylabel(u‘利息收入‘) # 添加圖表標題 plt.title(u‘貸款金額與利息收入‘) # 設置背景網格線的顏色,樣式,尺寸和透明度 plt.grid(color=‘#95a5a6‘, linestyle=‘--‘, linewidth=1, axis=‘both‘, alpha=0.4) # 顯示圖表 plt.show()
5.柱狀圖
# coding=utf-8 __author__ = ‘Jay‘ import numpy as np import pandas as pd #導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘]=False #用控制中文亂碼 loandata=pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) #按用戶等級grade字段對貸款金額進行求和匯總 loan_grade=loandata.groupby(‘grade‘)[‘loan_amnt‘].agg(sum) #創建一個一維數組賦值給a a=np.array([1,2,3,4,5,6]) #創建柱狀圖,數據源為按用戶等級匯總的貸款金額,設置顏色,透明度和外邊框顏色 plt.bar([1,2,3,4,5,6],loan_grade,color=‘#99CC01‘,alpha=0.8,align=‘center‘,edgecolor=‘white‘) #設置x軸標簽 plt.xlabel(u‘用戶等級‘) #設置y周標簽 plt.ylabel(u‘貸款金額‘) #設置圖表標題 plt.title(u‘不同用戶等級的貸款金額分布‘) #設置圖例的文字和在圖表中的位置 plt.legend([u‘貸款金額‘], loc=‘upper right‘) #設置背景網格線的顏色,樣式,尺寸和透明度 plt.grid(color=‘#95a5a6‘,linestyle=‘--‘, linewidth=1,axis=‘y‘,alpha=0.4) #設置數據分類名稱 plt.xticks(a,(u‘A級‘,u‘B級‘,u‘C級‘,u‘D級‘,u‘E級‘,u‘F級‘)) #顯示圖表 plt.show()
6.散點圖
# coding=utf-8 __author__ = ‘Jay‘ import pandas as pd #導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘]=False #用控制中文亂碼 loandata=pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) #按月匯總貸款金額,以0填充空值 loan_x=loandata[‘loan_amnt‘] #按月匯總利息金額,以0填充空值 loan_y=loandata[‘total_rec_int‘] #創建散點圖,貸款金額為x,利息金額為y,設置顏色,標記點樣式和透明度等 plt.scatter(loan_x,loan_y,60,color=‘white‘,marker=‘*‘,edgecolors=‘#0D8ECF‘,linewidth=3,alpha=0.8) #添加x軸標題 plt.xlabel(u‘貸款金額‘) #添加y軸標題 plt.ylabel(u‘利息收入‘) #添加圖表標題 plt.title(u‘貸款金額與利息收入‘) #設置背景網格線的顏色,樣式,尺寸和透明度 plt.grid(color=‘#95a5a6‘,linestyle=‘--‘, linewidth=1,axis=‘both‘,alpha=0.4) #顯示圖表 plt.show()
7.折線圖
# coding=utf-8 __author__ = ‘Jay‘ import numpy as np import pandas as pd #導入圖表庫以進行圖表繪制 import matplotlib.pyplot as plt plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] plt.rcParams[‘font.serif‘] = [‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘]=False #用來正常顯示負號 loandata=pd.DataFrame(pd.read_excel(‘loan_data.xlsx‘)) loandata.set_index(‘issue_d‘) #按月對貸款金額loan_amnt求均值 loan_plot=loandata[‘loan_amnt‘] #創建一個一維數組賦值給a a=np.array([1,2,3,4,5,6,7,8,9,10,11,12]) #創建折線圖,數據源為按月貸款均值,標記點,標記線樣式,線條寬度,標記點顏色和透明度 plt.plot(loan_plot,‘g^‘,loan_plot,‘g-‘,color=‘#99CC01‘,linewidth=3,markeredgewidth=3,markeredgecolor=‘#99CC01‘,alpha=0.8) #添加x軸標簽 plt.xlabel(u‘月份‘) #添加y周標簽 plt.ylabel(u‘貸款金額‘) #添加圖表標題 plt.title(u‘分月貸款金額分布‘) #添加圖表網格線,設置網格線顏色,線形,寬度和透明度 plt.grid( color=‘#95a5a6‘,linestyle=‘--‘, linewidth=1 ,axis=‘y‘,alpha=0.4) #設置數據分類名稱 plt.xticks(a, (u‘1月‘,u‘2月‘,u‘3月‘,u‘4月‘,u‘5月‘,u‘6月‘,u‘7月‘,u‘8月‘,u‘9月‘,u‘10月‘,u‘11月‘,u‘12月‘) ) #輸出圖表 plt.show()
自定義字體及配色
圖表中所使用的字體,可以使用下面的字體名稱替換family=後面的內容以改變圖表中所顯示的字體。
圖表中的顏色,可以直接使用顏色名稱,也可以使用簡稱來設置圖表中使用的顏色,本文中沒有使用默認的顏色,而是使用了自定義顏色。
自定義顏色的色號,本文中使用的是Hex色號,下面給出了Hex和RGB的對應關系,以及相應的顏色。可以使用下面的Hex色號替換本文中圖表的顏色。
issue_d | member_id | loan_amnt | term | grade | emp_length | annual_inc | loan_status | total_pymnt_inv | total_rec_int |
2016/6/16 | 1296599 | 5000 | 36 months | B | 10+ years | 24000 | Fully Paid | 5833.84 | 863.16 |
2016/9/13 | 1314167 | 2500 | 60 months | C | < 1 year | 30000 | Charged Off | 1008.71 | 435.17 |
2016/6/16 | 1313524 | 2400 | 36 months | C | 10+ years | 12252 | Fully Paid | 3005.67 | 605.67 |
2016/4/16 | 1277178 | 10000 | 36 months | C | 10+ years | 49200 | Fully Paid | 12231.89 | 2214.92 |
2016/6/16 | 1311748 | 3000 | 60 months | B | 1 year | 80000 | Current | 3581.12 | 1042.85 |
2016/1/16 | 1311441 | 5000 | 36 months | A | 3 years | 36000 | Fully Paid | 5632.21 | 632.21 |
2016/5/16 | 1304742 | 7000 | 60 months | C | 8 years | 47004 | Fully Paid | 10137.84 | 3137.84 |
######## | 1288686 | 3000 | 36 months | E | 9 years | 48000 | Fully Paid | 3939.14 | 939.14 |
2016/8/12 | 1306957 | 5600 | 60 months | F | 4 years | 40000 | Charged Off | 646.02 | 294.94 |
2016/3/13 | 1306721 | 5375 | 60 months | B | < 1 year | 15000 | Charged Off | 1469.34 | 533.42 |
######## | 1305201 | 6500 | 60 months | C | 5 years | 72000 | Fully Paid | 7678.02 | 1178.02 |
2016/8/13 | 1305008 | 12000 | 36 months | B | 10+ years | 75000 | Fully Paid | 13947.99 | 1947.99 |
######## | 1298717 | 9000 | 36 months | C | < 1 year | 30000 | Charged Off | 2270.7 | 570.26 |
2016/6/16 | 1304956 | 3000 | 36 months | B | 3 years | 15000 | Fully Paid | 3480.27 | 480.27 |
2016/6/17 | 140597 | 4000 | 12 months | D | 1 year | 10000 | Charged Off | 1200.02 | 500 |
python繪制圖