圖形繪制(全)


餅圖:

餅圖屬於最傳統的統計圖形之一,幾乎隨處可見,例如大型公司的屏幕牆、各種年度論壇的演示稿以及各大媒體發布的數據統計報告等;
餅圖是將一個圓分割成不同大小的楔(扇)形,而圓中的每一個楔形代表了不同的類別值,通常根據楔形的面積大小來判斷類別值的差異;

1 pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)
2 
3 # x:指定繪圖的數據 
4 # explode:指定餅圖某些部分的突出顯示,即呈現爆炸式
5 # labels:為餅圖添加標簽說明,類似於圖例說明 
6 # colors:指定餅圖的填充色 
7 # autopct:自動添加百分比顯示,可以采用格式化的方法顯示 
8 # pctdistance:設置百分比標簽與圓心的距離 
9 # labeldistance:設置各扇形標簽(圖例)與圓心的距離
 1 import matplotlib.pyplot as plt # 導入第三方模塊
 2 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解決中文亂碼情況
 3 
 4 # 構造數據
 5 edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
 6 labels = ['中專','大專','本科','碩士','其他']
 7 explode = [0,0.1,0,0,0]
 8 
 9 # 繪制餅圖                                                                              plt.axes(aspect='equal') # 如果python版本較低可能是扁的需要加該代碼   
10 plt.pie(x = edu,  # 繪圖數據
11         labels=labels,  # 添加教育水平標簽
12         autopct='%.1f%%',  # 設置百分比的格式,這里保留一位小數
13         explode = explode
14        )
15 
16 plt.show() # 顯示圖形

 

條形圖(有小分類):

雖然餅圖可以很好地表達離散型變量在各水平上的差異,但其不擅長對比差異不大或水平值過多的離散型變量,因為餅圖是通過各扇形面積的大小來比價差異的,面積的比較有時並不直觀;
對於條形圖而言,對比的是柱形的高低,柱體越高,代表的數值越大,反之亦然;

 1 bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
 2 
 3 # x:傳遞數值序列,指定條形圖中x軸上的刻度值
 4 #height:傳遞數值序列,指定條形圖y軸上的高度
 5 # width:指定條形圖的寬度,默認為0.8
 6 # bottom:用於繪制堆疊條形圖
 7 # color:指定條形圖的填充色
 8 # edgecolor:指定條形圖的邊框色
 9 # tick_label:指定條形圖的刻度標簽
10 # label:指定條形圖的標簽,一般用以添加圖例
 1 '''垂直條形圖'''
 2 import pandas as pd
 3 # 讀入數據
 4 GDP = pd.read_excel(r'Province GDP 2017.xlsx')
 5 
 6 # 設置繪圖風格(不妨使用R語言中的ggplot2風格)
 7 plt.style.use('ggplot')
 8 # 繪制條形圖
 9 plt.bar(x = range(GDP.shape[0]), # 指定條形圖x軸的刻度值
10         height = GDP.GDP, # 指定條形圖y軸的數值
11         tick_label = GDP.Province, # 指定條形圖x軸的刻度標簽
12         color = 'steelblue', # 指定條形圖的填充色
13        )
14 # 添加y軸的標簽
15 plt.ylabel('GDP(萬億)')
16 # 添加條形圖的標題
17 plt.title('2017年度6個省份GDP分布')
18 # 為每個條形圖添加數值標簽
19 for x,y in enumerate(GDP.GDP):
20     plt.text(x,y+0.1,'%s' %round(y,1),ha='center')
21 # 顯示圖形    
22 plt.show()

水平條形圖:

 1 # 對讀入的數據做升序排序
 2 GDP.sort_values(by = 'GDP', inplace = True)
 3 # 繪制條形圖
 4 plt.barh(y = range(GDP.shape[0]), # 指定條形圖y軸的刻度值
 5         width = GDP.GDP, # 指定條形圖x軸的數值
 6         tick_label = GDP.Province, # 指定條形圖y軸的刻度標簽
 7         color = 'steelblue', # 指定條形圖的填充色
 8        )
 9 # 添加x軸的標簽
10 plt.xlabel('GDP(萬億)')
11 # 添加條形圖的標題
12 plt.title('2017年度6個省份GDP分布')
13 # 為每個條形圖添加數值標簽
14 for y,x in enumerate(GDP.GDP):
15     plt.text(x+0.1,y,'%s' %round(x,1),va='center')
16 # 顯示圖形    
17 plt.show()

交叉條形圖:

 1 HuRun = pd.read_excel('HuRun.xlsx')
 2 # Pandas模塊之水平交錯條形圖
 3 HuRun_reshape = HuRun.pivot_table(index = 'City', columns='Year',
 4 values='Counts').reset_index()
 5 # 對數據集降序排序
 6 HuRun_reshape.sort_values(by = 2016, ascending = False, inplace = True)
 7 HuRun_reshape.plot(x = 'City', y = [2016,2017], kind = 'bar', 
 8 color = ['steelblue', 'indianred'], 
 9                               # 用於旋轉x軸刻度標簽的角度,0表示水平顯示刻度標簽
10                        rot = 0, 
11                        width = 0.8, title = '近兩年5個城市億萬資產家庭數比較')
12 
13 # 添加y軸標簽
14 plt.ylabel('億萬資產家庭數')
15 plt.xlabel('')
16 plt.show()

 

 

直方圖的繪制:

直方圖一般用來觀察數據的分布形態,橫坐標代表數值的均勻分段,縱坐標代表每個段內的觀測數量(頻數);
一般直方圖都會與核密度圖搭配使用,目的是更加清晰地掌握數據的分布特征;

1 plt.hist(x, bins=10, normed=False, orientation='vertical', color=None, label=None)
2 # x:指定要繪制直方圖的數據。 
3 # bins:指定直方圖條形的個數。
4 # normed:是否將直方圖的頻數轉換成頻率
5 # orientation:設置直方圖的擺放方向,默認為垂直方向 
6 # color:設置直方圖的填充色 
7 # edgecolor:設置直方圖邊框色 
8 # label:設置直方圖的標簽,可通過legend展示其圖例
 1 Titanic = pd.read_csv('titanic_train.csv')
 2 
 3 # 檢查年齡是否有缺失(如果數據中存在缺失值,將無法繪制直方圖)
 4 any(Titanic.Age.isnull())
 5 # 不妨刪除含有缺失年齡的觀察
 6 Titanic.dropna(subset=['Age'], inplace=True)
 7 # 繪制直方圖
 8 plt.hist(x = Titanic.Age, # 指定繪圖數據
 9          bins = 20, # 指定直方圖中條塊的個數
10          color = 'steelblue', # 指定直方圖的填充色
11          edgecolor = 'black' # 指定直方圖的邊框色
12          )
13 # 添加x軸和y軸標簽
14 plt.xlabel('年齡')
15 plt.ylabel('頻數')
16 # 添加標題
17 plt.title('乘客年齡分布')
18 # 顯示圖形
19 plt.show()

散點圖與氣泡圖:

# 散點圖:

如果需要研究兩個數值型變量之間是否存在某種關系,例如正向的線性關系,或者是趨勢性的非線性關系,那么散點圖將是最佳的選擇;

 1 scatter(x, y, s=20, c=None, marker='o', alpha=None, linewidths=None, edgecolors=None) 
 2 
 3 # x:指定散點圖的x軸數據
 4 # y:指定散點圖的y軸數據 
 5 # s:指定散點圖點的大小,默認為20,通過傳入其他數值型變量,可以實現氣泡圖的繪制
 6 # c:指定散點圖點的顏色,默認為藍色,也可以傳遞其他數值型變量,通過cmap參數的色階表示數值大小
 7 # marker:指定散點圖點的形狀,默認為空心圓
 8 # alpha:設置散點的透明度
 9 # linewidths:設置散點邊界線的寬度
10 # edgecolors:設置散點邊界線的顏色
 1 # 讀入數據
 2 iris = pd.read_csv(r'iris.csv')
 3 # 繪制散點圖
 4 plt.scatter(x = iris.Petal_Width, # 指定散點圖的x軸數據
 5             y = iris.Petal_Length, # 指定散點圖的y軸數據
 6             color = 'steelblue' # 指定散點圖中點的顏色
 7            )
 8 
 9 # 添加x軸和y軸標簽
10 plt.xlabel('花瓣寬度')
11 plt.ylabel('花瓣長度')
12 # 添加標題
13 plt.title('鳶尾花的花瓣寬度與長度關系')
14 # 顯示圖形
15 plt.show()

# 氣泡圖:

氣泡圖的實質就是通過第三個數值型變量控制每個散點的大小,點越大,代表的第三維數值越高,反之亦然;

氣泡圖的繪制,使用的仍然是scatter函數,區別在於函數的s參數被賦予了具體的數值型變量;

熱力圖:

熱力圖也稱為交叉填充表,圖形最典型的用法就是實現列聯表的可視化,即通過圖形的方式展現兩個離散變量之間的組合關系;

 1 # matplotlib繪制熱力圖不太方便需要借助於seaborn模塊
 2 sns.heatmap(data, cmap=None, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor ='white)
 3             
 4 # data:指定繪制熱力圖的數據集 
 5 # cmap:指定一個colormap對象,用於熱力圖的填充色
 6 # annot:指定一個bool類型的值或與data參數形狀一樣的數組,如果為True,就在熱力圖的每個單元上顯示數值 
 7 # fmt:指定單元格中數據的顯示格式
 8 # annot_kws:有關單元格中數值標簽的其他屬性描述,如顏色、大小等 
 9 # linewidths:指定每個單元格的邊框寬度 
10 # linecolor:指定每個單元格的邊框顏色
 1 import numpy as np
 2 import seaborn as sns
 3 # 讀取數據
 4 Sales = pd.read_excel(r'Sales.xlsx')
 5 # 根據交易日期,衍生出年份和月份字段
 6 Sales['year'] = Sales.Date.dt.year
 7 Sales['month'] = Sales.Date.dt.month
 8 # 統計每年各月份的銷售總額(繪制熱力圖之前,必須將數據轉換為交叉表形式)
 9 Summary = Sales.pivot_table(index = 'month', columns = 'year', values = 'Sales', aggfunc = np.sum)
10 Summary
11 # 繪制熱力圖
12 sns.heatmap(data = Summary, # 指定繪圖數據
13             cmap = 'PuBuGn', # 指定填充色
14             linewidths = .1, # 設置每個單元格邊框的寬度
15             annot = True, # 顯示數值
16             fmt = '.1e' # 以科學計算法顯示數據
17             )
18 #添加標題
19 plt.title('每年各月份銷售總額熱力圖')
20 # 顯示圖形
21 plt.show()

箱線圖:

箱線圖是另一種體現數據分布的圖形,通過該圖可以得知數據的下須值(Q1-1.5IQR)、下四 分位數(Q1)、中位數(Q2)、均值、上四分位(Q3)數和上須值(Q3+1.5IQR),更重要的是,箱線圖還可以發現數據中的異常點;

# 關於下須值、下四分位數、中位數、上四分位數和上須值及異常點的圖解:

 

 

 

 

 

 1 plt.boxplot(x, vert=None, whis=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
 2 
 3 # x:指定要繪制箱線圖的數據
 4 # vert:是否需要將箱線圖垂直擺放,默認垂直擺放
 5 # whis:指定上下須與上下四分位的距離,默認為1.5倍的四分位差
 6 # patch_artist:bool類型參數,是否填充箱體的顏色;默認為False
 7 # meanline:bool類型參數,是否用線的形式表示均值,默認為False
 8 #showmeans:bool類型參數,是否顯示均值,默認為False
 9 # showcaps:bool類型參數,是否顯示箱線圖頂端和末端的兩條線(即上下須),默認為True showbox:bool類型參數,是否顯示箱線圖的箱體,默認為True
10 # showfliers:是否顯示異常值,默認為True
11 # boxprops:設置箱體的屬性,如邊框色,填充色等
12 # labels:為箱線圖添加標簽,類似於圖例的作用
13 # filerprops:設置異常值的屬性,如異常點的形狀、大小、填充色等
14 # medianprops:設置中位數的屬性,如線的類型、粗細等
15 # meanprops:設置均值的屬性,如點的大小、顏色等
16 # capprops:設置箱線圖頂端和末端線條的屬性,如顏色、粗細等
17 # whiskerprops:設置須的屬性,如顏色、粗細、線的類型等
 1 Sec_Buildings = pd.read_excel('sec_buildings.xlsx')
 2 # 繪制箱線圖
 3 plt.boxplot(x = Sec_Buildings.price_unit, # 指定繪圖數據
 4             patch_artist=True, # 要求用自定義顏色填充盒形圖,默認白色填充
 5             showmeans=True, # 以點的形式顯示均值
 6             boxprops = {'color':'black','facecolor':'steelblue'},# 設置箱體屬性,如邊框色和填充色
 7             # 設置異常點屬性,如點的形狀、填充色和點的大小
 8             flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3,'markeredgecolor':'red'}, 
 9             # 設置均值點的屬性,如點的形狀、填充色和點的大小
10             meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4}, 
11             # 設置中位數線的屬性,如線的類型和顏色
12             medianprops = {'linestyle':'--','color':'orange'}, 
13             labels = [''] # 刪除x軸的刻度標簽,否則圖形顯示刻度標簽為1
14            )
15 # 添加圖形標題
16 plt.title('二手房單價分布的箱線圖')
17 # 顯示圖形
18 plt.show()

折線圖:

對於時間序列數據而言,一般都會使用折線圖反映數據背后的趨勢。通常折線圖的橫坐標指代日期數據,縱坐標代表某個數值型變量,當然還可以使用第三個離散變量對折線圖進行分組處理;

 1 plt.plot(x, y, linestyle, linewidth, color, marker,markersize, markeredgecolor, markerfactcolor,markeredgewidth, label, alpha)
 2 
 3 # x:指定折線圖的x軸數據
 4 # y:指定折線圖的y軸數據
 5 # linestyle:指定折線的類型,可以是實線、虛線、點虛線、點點線等,默認為實線
 6 # linewidth:指定折線的寬度
 7 # marker:可以為折線圖添加點,該參數是設置點的形狀
 8 # markersize:設置點的大小
 9 # markeredgecolor:設置點的邊框色
10 # markerfactcolor:設置點的填充色
11 # markeredgewidth:設置點的邊框寬度
12 # label:為折線圖添加標簽,類似於圖例的作用
 1 %matplotlib  # 以彈框的形式顯示圖形
 2 # 數據讀取
 3 wechat = pd.read_excel(r'wechat.xlsx')
 4 # 繪制單條折線圖
 5 plt.plot(wechat.Date, # x軸數據
 6          wechat.Counts, # y軸數據
 7          linestyle = '-', # 折線類型
 8          linewidth = 2, # 折線寬度
 9          color = 'steelblue', # 折線顏色
10          marker = 'o', # 折線圖中添加圓點
11          markersize = 6, # 點的大小
12          markeredgecolor='black', # 點的邊框色
13          markerfacecolor='brown') # 點的填充色
14 # 獲取圖的坐標信息
15 ax = plt.gca()
16 # 設置日期的顯示格式  
17 date_format = mpl.dates.DateFormatter("%m-%d")  
18 ax.xaxis.set_major_formatter(date_format) 
19 # 設置x軸每個刻度的間隔天數
20 xlocator = mpl.ticker.MultipleLocator(7)
21 ax.xaxis.set_major_locator(xlocator)
22 # 添加y軸標簽
23 plt.ylabel('人數')
24 # 添加圖形標題
25 plt.title('每天微信文章閱讀人數趨勢')
26 # 顯示圖形
27 plt.show()
28 
29 
30 # 繪制兩條折線圖
31 # 導入模塊,用於日期刻度的修改
32 import matplotlib as mpl
33 # 繪制閱讀人數折線圖
34 plt.plot(wechat.Date, # x軸數據
35          wechat.Counts, # y軸數據
36          linestyle = '-', # 折線類型,實心線
37          color = 'steelblue', # 折線顏色
38          label = '閱讀人數'
39          )
40 # 繪制閱讀人次折線圖
41 plt.plot(wechat.Date, # x軸數據
42          wechat.Times, # y軸數據
43          linestyle = '--', # 折線類型,虛線
44          color = 'indianred', # 折線顏色
45          label = '閱讀人次'
46          )
47 # 獲取圖的坐標信息
48 ax = plt.gca()
49 # 設置日期的顯示格式  
50 date_format = mpl.dates.DateFormatter("%m-%d")  
51 ax.xaxis.set_major_formatter(date_format) 
52 # 設置x軸顯示多少個日期刻度
53 # xlocator = mpl.ticker.LinearLocator(10)
54 # 設置x軸每個刻度的間隔天數
55 xlocator = mpl.ticker.MultipleLocator(7)
56 ax.xaxis.set_major_locator(xlocator)
57 # 為了避免x軸刻度標簽的緊湊,將刻度標簽旋轉45度
58 plt.xticks(rotation=45)
59 
60 # 添加y軸標簽
61 plt.ylabel('人數')
62 # 添加圖形標題
63 plt.title('每天微信文章閱讀人數與人次趨勢')
64 # 添加圖例
65 plt.legend()
66 # 顯示圖形
67 plt.show()

組合圖:

工作中往往會根據業務需求,將繪制的多個圖形組合到一個大圖框內,形成類似儀表板的效果;

 1 plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)
 2 
 3 shape:指定組合圖的框架形狀,以元組形式傳遞,如2×3的矩陣可以表示成(2,3) 
 4 loc:指定子圖所在的位置,如shape中第一行第一列可以表示成(0,0) 
 5 rowspan:指定某個子圖需要跨幾行
 6 colspan:指定某個子圖需要跨幾列
 7 
 8 """
 9 # 設置大圖框的長和高 plt.figure(figsize = (12,6))
10 # 設置第一個子圖的布局
11 ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
12 # 設置第二個子圖的布局
13 ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
14 # 設置第三個子圖的布局
15 ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
16 # 設置第四個子圖的布局
17 ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
18 """
 1 # 讀取數據
 2 Prod_Trade = pd.read_excel(r'Prod_Trade.xlsx')
 3 # 衍生出交易年份和月份字段
 4 Prod_Trade['year'] = Prod_Trade.Date.dt.year
 5 Prod_Trade['month'] = Prod_Trade.Date.dt.month
 6 
 7 # 設置大圖框的長和高
 8 plt.figure(figsize = (12,6))
 9 # 設置第一個子圖的布局
10 ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
11 # 統計2012年各訂單等級的數量
12 Class_Counts = Prod_Trade.Order_Class[Prod_Trade.year == 2012].value_counts()
13 Class_Percent = Class_Counts/Class_Counts.sum()
14 # 繪制訂單等級餅圖
15 ax1.pie(x = Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
16 # 添加標題
17 ax1.set_title('各等級訂單比例')
18 
19 # 設置第二個子圖的布局
20 ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
21 # 統計2012年每月銷售額
22 Month_Sales = Prod_Trade[Prod_Trade.year == 2012].groupby(by = 'month').aggregate({'Sales':np.sum})
23 # 繪制銷售額趨勢圖
24 Month_Sales.plot(title = '2012年各月銷售趨勢', ax = ax2, legend = False)
25 # 刪除x軸標簽
26 ax2.set_xlabel('')
27 
28 # 設置第三個子圖的布局
29 ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
30 # 繪制各運輸方式的成本箱線圖
31 sns.boxplot(x = 'Transport', y = 'Trans_Cost', data = Prod_Trade, ax = ax3)
32 # 添加標題
33 ax3.set_title('各運輸方式成本分布')
34 # 刪除x軸標簽
35 ax3.set_xlabel('')
36 # 修改y軸標簽
37 ax3.set_ylabel('運輸成本')
38 
39 # 設置第四個子圖的布局
40 ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
41 # 2012年客單價分布直方圖
42 sns.distplot(Prod_Trade.Sales[Prod_Trade.year == 2012], bins = 40, norm_hist = True, ax = ax4, hist_kws = {'color':'steelblue'}, kde_kws=({'linestyle':'--', 'color':'red'}))
43 # 添加標題
44 ax4.set_title('2012年客單價分布圖')
45 # 修改x軸標簽
46 ax4.set_xlabel('銷售額')
47 
48 # 調整子圖之間的水平間距和高度間距
49 plt.subplots_adjust(hspace=0.6, wspace=0.3)
50 # 圖形顯示
51 plt.show()

可視化相關模塊:

1.matplotlib

2.seaborn

3.highcharts

4.echarts

  pyecharts # 可以通過python代碼直接調用

5.ds.js


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM