python 數據分析--數據可視化工具matplotlib


說明:
    數據可視化中的數據集下載地址:(數據來源:從零開始學python數據分析和挖掘)
    鏈接:https://pan.baidu.com/s/1zrNpzSNVHd8v1rGFRzKipQ 提取碼:mx9d

數據可視化是數據分析中的一部分,可用於數據的探索和查找缺失值等,也是展現數據的重要手段。matplotlib是一個強大的工具箱,其完整的圖表樣式函數和個性化的自定義設置,可以滿足幾乎所有的2D和一些3D繪圖的需求。

1. 條形圖

條形圖主要用來表示分組(或離散)變量的可視化,可以使用matplotlib完成條形圖的繪制。

1.1 垂直條形圖

以垂直條形圖為例,離散型變量在各水平上的差異就是比較柱形的高低,柱體越高,代表的數值越大。plt.bar()函數的參數列表:

  • left:傳遞數值序列,指定條形圖中x軸上的刻度值,現left需改為x
  • height:傳遞數值序列,指定條形圖y軸上的高度。
  • width:指定條形圖的寬度,默認為0.8。
  • bottom:用於繪制堆疊條形圖。
  • color:指定條形圖的填充色。
  • edgecolor:指定條形圖的邊框色。
  • linewidth:指定條形圖邊框的寬度,如果指定為0,表示不繪制邊框。
  • tick_label:指定條形圖的刻度標簽。
  • xerr:如果參數不為None,表示在條形圖的基礎上添加誤差棒。yerr:參數含義同xerr。
  • label:指定條形圖的標簽,一般用以添加圖例。
  • ecolor:指定條形圖誤差棒的顏色。
  • align:指定x軸刻度標簽的對齊方式,默認為center,表示刻度標簽居中對齊,如果設置為 edge,則表示在每個條形的左下角呈現刻度標簽。
  • log:bool類型參數,是否對坐標軸進行log變換,默認為False。
  • **kwargs:關鍵字參數,用於對條形圖進行其他設置,如透明度等。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4Ol3ti7S-1586005368658)(attachment:image.png)]

import matplotlib.pyplot as plt
import pandas as pd
# 條形圖的繪制--垂直條形圖

# 讀入數據
GDP = pd.read_excel(r'E:\Data\4\Province GDP 2017.xlsx')
# 設置繪圖風格(不妨使用R語言中的ggplot2風格)
plt.style.use('ggplot')
# 解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False

# 添加條形圖的標題
plt.title('2017年度6個省份GDP分布')
# 添加y軸的標簽
plt.ylabel('GDP(萬億)')

# 繪制條形圖
plt.bar( x = range(GDP.shape[0]),   # 指定條形圖x軸的刻度值
        height = GDP.GDP,           # 指定條形圖y軸的數值
        tick_label = GDP.Province,  # 指定條形圖x軸的刻度標簽
        color = 'pink',        # 指定條形圖的填充色
       )

# 為每個條形圖添加數值標簽
for x,y in enumerate(GDP.GDP):
    plt.text(x,y+0.1,'%s' %round(y,1),ha='center') #round 四舍五入保留1位小數
# 顯示圖形    
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-t1xA15xB-1586005368660)(output_8_0.png)]

1.2 水平條形圖

水平條形圖不再是bar函數,而是barh函數。對原始數據做升序排序,但是圖形看上去是降序,是因為水平條形圖的y軸刻度值是從下往上布置的,所以條形圖從下往上是滿足升序的。

# 條形圖的繪制--水平條形圖

# 導入第三方庫和讀入數據同上

# 添加條形圖的標題
plt.title('2017年度6個省份GDP分布')
# 添加x軸的標簽
plt.xlabel('GDP(萬億)')

# 對讀入的數據作升序排序
GDP.sort_values(by = 'GDP', inplace = True)
# 繪制條形圖
plt.barh(y = range(GDP.shape[0]),      # 指定條形圖y軸的刻度值
        width = GDP.GDP,               # 指定條形圖x軸的數值
        tick_label = GDP.Province,     # 指定條形圖y軸的刻度標簽
        color = 'green',               # 指定條形圖的填充色
       )

# 為每個條形圖添加數值標簽
for y,x in enumerate(GDP.GDP):
    plt.text(x+0.1,y,'%s' %round(x,1),va='center') #此處x在前,y在后,數值標簽加在x上, 居中也是垂直方向居中
# 顯示圖形    
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CsAf7AEs-1586005368660)(output_11_0.png)]

1.3 堆疊條形圖

不管是垂直條形圖還是水平條形圖,只是反映單個離散變量的統計圖形,如果想通過條形圖傳遞兩個離散變量的信息該如何做到?這就需要使用堆疊條形圖,該類型條形圖的橫坐標代表一個維度的離散變量,堆疊起來的“塊”代表了另一個維度的離散變量。這樣的條形圖,最大的優點是可以方便比較累積和。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yMtNH6UQ-1586005368661)(attachment:image.png)]

# 條形圖的繪制--堆疊條形圖
# 讀入數據
Industry_GDP = pd.read_excel(r'E:\Data\4\Industry_GDP.xlsx')

# 取出四個不同的季度標簽,用作堆疊條形圖x軸的刻度標簽
Quarters = Industry_GDP.Quarter.unique()

# 取出第一產業的四季度值
Industry1 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第一產業']
# 重新設置行索引
Industry1.index = range(len(Quarters))

# 取出第二產業的四季度值
Industry2 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第二產業']
# 重新設置行索引
Industry2.index = range(len(Quarters))

# 取出第三產業的四季度值
Industry3 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第三產業']

# 繪制堆疊條形圖
# 各季度下第一產業的條形圖
plt.bar(x = range(len(Quarters)), height=Industry1, color = 'yellow', label = '第一產業', tick_label = Quarters)
# 各季度下第二產業的條形圖
plt.bar(x = range(len(Quarters)), height=Industry2, bottom = Industry1, color = 'green', label = '第二產業')
# 各季度下第三產業的條形圖
plt.bar(x = range(len(Quarters)), height=Industry3, bottom = Industry1  + Industry2, color = 'red', label = '第三產業')


# 添加y軸標簽
plt.ylabel('生成總值(億)')
# 添加圖形標題
plt.title('2017年各季度三產業總值')

# 顯示各產業的圖例
plt.legend()
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KpLfL5d4-1586005368661)(output_15_0.png)]

1.4 水平交錯條形圖

堆疊條形圖可以包含兩個離散變量的信息,而且可以比較各季度整體產值的高低水平,但是其缺點是不易區分“塊”之間的差異,例如二、三季度的第三產業值差異就不是很明顯,區分高低就相對困難。而交錯條形圖恰好就可以解決這個問題,該類型的條形圖就是將堆疊的“塊”水平排開。

# 條形圖的繪制--水平交錯條形圖

# 導入第三方模塊
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 讀取數據
Industry_GDP = pd.read_excel(r'E:\Data\4\Industry_GDP.xlsx')

# 取出四個不同的季度標簽,用作堆疊條形圖x軸的刻度標簽
Quarters = Industry_GDP.Quarter.unique()

# 取出第一、二、三產業的四季度值
Industry1 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第一產業']
Industry1.index = range(len(Quarters))# 重新設置行索引
Industry2 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第二產業']
Industry2.index = range(len(Quarters))
Industry3 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第三產業']


# 繪制水平交錯條形圖
bar_width = 0.3
# 各季度下第一產業的條形圖
plt.bar(x = np.arange(len(Quarters)), height=Industry1, color = 'yellow', label = '第一產業' , width = bar_width)   
# 各季度下第二產業的條形圖
plt.bar(x = np.arange(len(Quarters))+ bar_width, height=Industry2, color = 'green', label = '第二產業', width = bar_width)
# 各季度下第三產業的條形圖
plt.bar(x = np.arange(len(Quarters))+ 2*bar_width, height=Industry3, color = 'indianred', label = '第三產業', width = bar_width)

# 為每個條形圖添加數值標簽
for x,y in enumerate(Industry1):
    plt.text(x,y+0.1,'%s' %round(y,1),ha='center') # 為每個條形圖添加數值標簽
for x,y in enumerate(Industry2):
    plt.text(x+0.3,y+0.1,'%s' %round(y,1),ha='center')    
for x,y in enumerate(Industry3):
    plt.text(x+0.6,y+0.1,'%s' %round(y,1),ha='center') 
# 添加刻度標簽
plt.xticks(np.arange(4)+0.3, Quarters)


plt.ylabel('生成總值(億)')
plt.title('2017年各季度三產業總值')
plt.legend(loc='upper left',bbox_to_anchor=(0,1.2),ncol=3, shadow=True)
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WSpB64fc-1586005368662)(output_18_0.png)]

2.餅狀圖

餅圖屬於最傳統的統計圖形之一,如果你選擇matplotlib模塊繪制餅圖的話,首先需要導入該模塊的子模塊pyplot,然后調用模塊中的pie函數。

  • x:指定繪圖的數據。
  • explode:指定餅圖某些部分的突出顯示,即呈現爆炸式。
  • labels:為餅圖添加標簽說明,類似於圖例說明。
  • colors:指定餅圖的填充色。
  • autopct:自動添加百分比顯示,可以采用格式化的方法顯示。
  • pctdistance:設置百分比標簽與圓心的距離。
  • shadow:是否添加餅圖的陰影效果。
  • labeldistance:設置各扇形標簽(圖例)與圓心的距離。
  • startangle:設置餅圖的初始擺放角度。
  • radius:設置餅圖的半徑大小。
  • counterclock:是否讓餅圖按逆時針順序呈現。
  • wedgeprops:設置餅圖內外邊界的屬性,如邊界線的粗細、顏色等。
  • textprops:設置餅圖中文本的屬性,如字體大小、顏色等。
  • center:指定餅圖的中心點位置,默認為原點。
  • frame:是否要顯示餅圖背后的圖框,如果設置為True的話,需要同時控制圖框x軸、y軸的范圍和餅圖的中心位置。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 讀取數據
Industry_GDP = pd.read_excel(r'E:\Data\4\Industry_GDP.xlsx')

# 取出四個不同的季度標簽,用作堆疊條形圖x軸的刻度標簽
Quarters = Industry_GDP.Quarter.unique()

# 取出第一、二、三產業的四季度值
Industry1 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第一產業']
Industry1.index = range(len(Quarters))# 重新設置行索引
Industry2 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第二產業']
Industry2.index = range(len(Quarters))
Industry3 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第三產業']
Industry3.index = range(len(Quarters))

DataQ1 = Industry1[0] + Industry2[0] + Industry3[0] 
DataQ2 = Industry1[1] + Industry2[1] + Industry3[1] 
DataQ3 = Industry1[2] + Industry2[2] + Industry3[2] 
DataQ4 = Industry1[3] + Industry2[3] + Industry3[3] 
DataToatal = DataQ1+DataQ2+DataQ3+DataQ4
# 構造數據
Industry  = [DataQ1/DataToatal,DataQ2/DataToatal,DataQ3/DataToatal,DataQ4/DataToatal]
labels = Quarters

# 解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
explode = [0,0,0,0.1] 
# 繪制餅圖
plt.pie(x = Industry,                           # 繪圖數據
        labels=labels,                          # 添加教育水平標簽
        autopct='%.1f%%',                       # 設置百分比的格式,這里保留一位小數
        colors = np.array(['#332DF1','#2F8177','#A21B63','#22BB99']),
        radius= 1.2,                            #  圓的半徑
        shadow= True,                            #  圓的陰影
        startangle = 0,                         # 設置餅圖的初始角度
        counterclock= False,                   # False 表示逆時針
        wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},          # 設置餅圖內外邊界的屬性值
        textprops = {'fontsize':20, 'color':'black'},                  # 設置文本標簽的屬性值
        explode= explode,                                              #第四季度突出顯示
       )
# 添加圖標題
plt.title('各個季度工業GDP總值百分比情況')
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tHzSSByE-1586005368663)(output_21_0.png)]

3. 直方圖與核密度曲線

直方圖一般用來觀察數據的分布形態,橫坐標代表數值的均勻分段,縱坐標代表每個段內的觀測數量(頻數)。一般直方圖都會與核密度圖搭配使用,目的是更加清晰地掌握數據的分布特征。matplotlib模塊中的hist函數就是用來繪制直方圖的。關於該函數的語參數含義如下:

  • x:指定要繪制直方圖的數據。
  • bins:指定直方圖條形的個數。
  • range:指定直方圖數據的上下界,默認包含繪圖數據的最大值和最小值。
  • normed:是否將直方圖的頻數轉換成頻率。
  • weights:該參數可為每一個數據點設置權重。
  • cumulative:是否需要計算累計頻數或頻率。
  • bottom:可以為直方圖的每個條形添加基准線,默認為0。
  • histtype:指定直方圖的類型,默認為bar,除此之外,還有barstacked、stepstepfilled。
  • align:設置條形邊界值的對齊方式,默認為mid,另外還有left和right。
  • orientation:設置直方圖的擺放方向,默認為垂直方向。
  • rwidth:設置直方圖條形的寬度。
  • log:是否需要對繪圖數據進行log變換。
  • color:設置直方圖的填充色。
  • edgecolor:設置直方圖邊框色。
  • label:設置直方圖的標簽,可通過legend展示其圖例。
  • stacked:當有多個數據時,是否需要將直方圖呈堆疊擺放,默認水平擺放。
import matplotlib.pyplot as plt 
import pandas as pd 

Titanic = pd.read_csv(r"E:/Data/4/titanic_train.csv")
if any(Titanic.Age.isnull()):
    Titanic.dropna(subset=['Age'], inplace=True)
Titanic.head()    
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
plt.hist(x = Titanic.Age,
         bins = 20,
         color= 'steelblue',
         edgecolor = 'black')
plt.xlabel("年齡")
plt.ylabel("人數")
plt.title("泰坦尼克號乘客年齡分布")

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VomyCGgg-1586005368664)(output_25_1.png)]

如果原始數據集中存在缺失值,一定要對缺失觀測進行刪除或替換,否則無法繪制成功。如果在直方圖的基礎上再添加核密度圖,通過matplotlib模塊就比較吃力了,因為首先得計算出每一個年齡對應的核密度值。為了簡單起見,下面利用pandas模塊中的plot方法將直方圖和核密度圖繪制到一起。

# Pandas模塊繪制直方圖和核密度圖

# 繪制直方圖
Titanic.Age.plot(kind = 'hist', bins = 20, color = 'steelblue', edgecolor = 'black', normed = True, label = '直方圖')

# 繪制核密度圖
Titanic.Age.plot(kind = 'kde', color = 'red', label = '核密度圖')
# 添加x軸和y軸標簽


# 添加標題
plt.title('泰坦尼克號乘客年齡分布')
plt.xlabel('年齡')
plt.ylabel('核密度值')

# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TWg7ki3D-1586005368664)(output_27_0.png)]

4. 箱線圖

箱線圖是另一種體現數據分布的圖形,通過該圖可以得知數據的下須值(Q1-1.5IQR)、下四分位數(Q1)、中位數(Q2)、均值、上四分位(Q3)數和上須值(Q3+1.5IQR),更重要的是,箱線圖還可以發現數據中的異常點。matplotlib模塊中繪制箱線圖的boxplot函數的參數含義如下:

  • x:指定要繪制箱線圖的數據。
  • notch:是否以凹口的形式展現箱線圖,默認非凹口。
  • sym:指定異常點的形狀,默認為+號顯示。
  • vert:是否需要將箱線圖垂直擺放,默認垂直擺放。
  • whis:指定上下須與上下四分位的距離,默認為1.5倍的四分位差。
  • positions:指定箱線圖的位置,默認為[0,1,2…]。
  • widths:指定箱線圖的寬度,默認為0.5。
  • patch_artist:bool類型參數,是否填充箱體的顏色;默認為False。
  • meanline:bool類型參數,是否用線的形式表示均值,默認為False。
  • showmeans:bool類型參數,是否顯示均值,默認為False。
  • showcaps:bool類型參數,是否顯示箱線圖頂端和末端的兩條線(即上下須),默認為True。
  • showbox:bool類型參數,是否顯示箱線圖的箱體,默認為True。
  • showfliers:是否顯示異常值,默認為True。
  • boxprops:設置箱體的屬性,如邊框色,填充色等。
  • labels:為箱線圖添加標簽,類似於圖例的作用。
  • filerprops:設置異常值的屬性,如異常點的形狀、大小、填充色等。
  • medianprops:設置中位數的屬性,如線的類型、粗細等。
  • meanprops:設置均值的屬性,如點的大小、顏色等。
  • capprops:設置箱線圖頂端和末端線條的屬性,如顏色、粗細等。
  • whiskerprops:設置須的屬性,如顏色、粗細、線的類型等。

在這里插入圖片描述

import matplotlib.pyplot as plt 
import pandas as pd
import numpy as np

# 讀取數據
Sec_Buildings = pd.read_excel(r"E:/Data/4/sec_buildings.xlsx")
Sec_Buildings.head()
block type size region height direction price built_date price_unit
0 梅園六街坊 2室0廳 47.72 浦東 低區/6層 朝南 500 1992年建 104777
1 碧雲新天地(一期) 3室2廳 108.93 浦東 低區/6層 朝南 735 2002年建 67474
2 博山小區 1室1廳 43.79 浦東 中區/6層 朝南 260 1988年建 59374
3 金橋新村四街坊(博興路986弄) 1室1廳 41.66 浦東 中區/6層 朝南北 280 1997年建 67210
4 博山小區 1室0廳 39.77 浦東 高區/6層 朝南 235 1987年建 59089
# 解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False

# 繪制箱線圖
plt.boxplot(x = Sec_Buildings.price_unit, # 指定繪圖數據
            patch_artist=True, # 要求用自定義顏色填充盒形圖,默認白色填充
            showmeans=True,    # 以點的形式顯示均值
            boxprops = {'color':'black','facecolor':'steelblue'},                   # 設置箱體屬性,如邊框色和填充色
            flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3},    # 設置異常點屬性,如點的形狀、填充色和點的大小
            meanprops = {'marker':'D','markerfacecolor':'yellow', 'markersize':4},  # 設置均值點的屬性,如點的形狀、填充色和點的大小
            medianprops = {'linestyle':'--','color':'green'},                       # 設置中位數線的屬性,如線的類型和顏色
            labels = ['']                                                           # 刪除x軸的刻度標簽,否則圖形顯示刻度標簽為1
           )
# 添加圖形標題
plt.title('二手房單價分布的箱線圖')
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AjclVEpF-1586005368667)(output_33_0.png)]

# 二手房在各行政區域的平均單價
group_region = Sec_Buildings.groupby('region')
avg_price = group_region.aggregate({'price_unit':np.mean}).sort_values('price_unit', ascending = False)

# 通過循環,將不同行政區域的二手房存儲到列表中
region_price = []
for region in avg_price.index:
    region_price.append(Sec_Buildings.price_unit[Sec_Buildings.region == region])
    
# 繪制分組箱線圖
plt.boxplot(x = region_price, 
            patch_artist=True,
            labels = avg_price.index, # 添加x軸的刻度標簽
            showmeans=True, 
            boxprops = {'color':'black', 'facecolor':'steelblue'}, 
            flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3}, 
            meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4},
            medianprops = {'linestyle':'--','color':'orange'}
           )

# 添加y軸標簽
plt.ylabel('單價(元)')
# 添加標題
plt.title('不同行政區域的二手房單價對比')
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LHcVrpo9-1586005368669)(output_34_0.png)]

5. 折線圖

對於時間序列數據而言,一般都會使用折線圖反映數據背后的趨勢。通常折線圖的橫坐標指代日期數據,縱坐標代表某個數值型變量,當然還可以使用第三個離散變量對折線圖進行分組處理。折線圖的繪制可以使用matplotlib模塊中的plot函數實現。該函數參數含義如下:

  • x:指定折線圖的x軸數據。
  • y:指定折線圖的y軸數據。
  • linestyle:指定折線的類型,可以是實線、虛線、點虛線、點點線等,默認為實線。
  • linewidth:指定折線的寬度。
  • marker:可以為折線圖添加點,該參數是設置點的形狀。
  • markersize:設置點的大小。
  • markeredgecolor:設置點的邊框色。
  • markerfactcolor:設置點的填充色。
  • markeredgewidth:設置點的邊框寬度。
  • label:為折線圖添加標簽,類似於圖例的作用。
import random
import matplotlib.pyplot as plt
x = [1,2,2,4,4,6,7,8,9,9,11]
y = [i**2 for i in x ]
plt.plot(x, y , label='x**2')
plt.xlabel('x label')
plt.ylabel('y label')

plt.title("Simple Plot")

plt.legend()

plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-R1fCRRAW-1586005368669)(output_37_0.png)]

6. 散點圖

如果需要研究兩個數值型變量之間是否存在某種關系,例如正向的線性關系,或者是趨勢性的非線性關系,那么散點圖將是最佳的選擇。matplotlib模塊中的scatter函數可以非常方便地繪制兩個數值型變量的散點圖。函數的參數含義寫在下方:

  • x:指定散點圖的x軸數據。
  • y:指定散點圖的y軸數據。
  • s:指定散點圖點的大小,默認為20,通過傳入其他數值型變量,可以實現氣泡圖的繪制。
  • c:指定散點圖點的顏色,默認為藍色,也可以傳遞其他數值型變量,通過cmap參數的色階表示數值大小。
  • marker:指定散點圖點的形狀,默認為空心圓。
  • cmap:指定某個Colormap值,只有當c參數是一個浮點型數組時才有效。
  • norm:設置數據亮度,標准化到0~1,使用該參數仍需要參數c為浮點型的數組。
  • vmin、vmax:亮度設置,與norm類似,如果使用norm參數,則該參數無效。
  • alpha:設置散點的透明度。
  • linewidths:設置散點邊界線的寬度。
  • edgecolors:設置散點邊界線的顏色。
import matplotlib.pyplot as plt
import pandas as pd

# 讀入數據
iris = pd.read_csv(r'E:\Data\4\iris.csv')
iris.head()
Sepal_Length Sepal_Width Petal_Length Petal_Width Species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
# 繪制散點圖
plt.scatter(x = iris.Petal_Width, # 指定散點圖的x軸數據
            y = iris.Petal_Length, # 指定散點圖的y軸數據
            color = 'steelblue' # 指定散點圖中點的顏色
           )
# 添加x軸和y軸標簽
plt.xlabel('花瓣寬度')
plt.ylabel('花瓣長度')
# 添加標題
plt.title('鳶尾花的花瓣寬度與長度關系')
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dGqzr52c-1586005368670)(output_41_0.png)]

7. 氣泡圖

氣泡圖的實質就是通過第三個數值型變量控制每個散點的大小,點越大,代表的第三維數值越高,反之亦然。matplotlib模塊中的scatter函數繪制了散點圖,繪制氣泡圖將繼續使用該函數。關鍵的參數是s,即散點圖中點的大小,如果將數值型變量傳遞給該參數,就可以輕松繪制氣泡圖了。

import matplotlib.pyplot as plt
import pandas as pd
# 讀取數據
Prod_Category = pd.read_excel(r'E:\Data\4\SuperMarket.xlsx')
Prod_Category.head()
Category Sub_Category Profit Sales Profit_Ratio std_ratio
0 辦公用品 信封 49241.5600 176861.52 0.278419 0.839328
1 辦公用品 剪刀,尺子,鋸 -7953.5700 80800.03 -0.098435 0.001000
2 辦公用品 夾子及其配件 306455.2895 1026410.56 0.298570 0.884155
3 辦公用品 家用電器 100258.3200 742663.39 0.134998 0.520283
4 辦公用品 容器,箱子 10068.2100 1112252.53 0.009052 0.240110
# 將利潤率標准化到[0,1]之間(因為利潤率中有負數),然后加上微小的數值0.001
range_diff = Prod_Category.Profit_Ratio.max()-Prod_Category.Profit_Ratio.min()
Prod_Category['std_ratio'] = (Prod_Category.Profit_Ratio-Prod_Category.Profit_Ratio.min())/range_diff + 0.001

# 繪制辦公用品的氣泡圖
plt.scatter(x = Prod_Category.Sales[Prod_Category.Category == '辦公用品'], 
            y = Prod_Category.Profit[Prod_Category.Category == '辦公用品'], 
            s = Prod_Category.std_ratio[Prod_Category.Category == '辦公用品']*1000,
            color = 'steelblue', label = '辦公用品', alpha = 0.6
            )
# 繪制技術產品的氣泡圖
plt.scatter(x = Prod_Category.Sales[Prod_Category.Category == '技術產品'], 
           y = Prod_Category.Profit[Prod_Category.Category == '技術產品'], 
           s = Prod_Category.std_ratio[Prod_Category.Category == '技術產品']*1000,
           color = 'indianred' , label = '技術產品', alpha = 0.6
          )
# 繪制家具產品的氣泡圖
plt.scatter(x = Prod_Category.Sales[Prod_Category.Category == '家具產品'], 
           y = Prod_Category.Profit[Prod_Category.Category == '家具產品'], 
           s = Prod_Category.std_ratio[Prod_Category.Category == '家具產品']*1000,
           color = 'black' , label = '家具產品', alpha = 0.6
          )

# 添加x軸和y軸標簽
plt.xlabel('銷售額')
plt.ylabel('利潤')
# 添加標題
plt.title('銷售額、利潤及利潤率的氣泡圖')
# 添加圖例
plt.legend()
# 顯示圖形
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GjTT2KbZ-1586005368671)(output_45_0.png)]

如圖上所示,應用scatter函數繪制了分組氣泡圖,從圖中可知,辦公用品和家具產品的利潤率波動比較大(因為這兩類圓點大小不均)。從代碼角度來看,繪圖的核心部分是使用三次scatter函數,而且代碼結構完全一樣,如果讀者對for循環掌握得比較好,完全可以使用循環的方式替換三次scatter函數的重復應用。需要說明的是,如果s參數對應的變量值小於等於0,則對應的氣泡點是無法繪制出來的。這里提供一個解決思路,就是先將該變量標准化為[0,1],再加上一個非常小的值,如0.001。如上代碼所示,最后對s參數擴大1000倍的目的就是凸顯氣泡的大小。

當然,作為強大的繪圖庫,Matplotlib的功能遠遠不止上面這一點,未涉及到的,以后需要用的時候,在進一步學習吧,堅持,堅持,堅持,每天進步一點點,不積跬步,無以至千里;不積小流,無以成江河


免責聲明!

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



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