日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Matplotlib可视化数据分析图表下(常用图表的绘制、折线图、柱形图、直方图、饼形图、散点图、面积图、热力图、箱形图、3D图表、绘制多个图表、双y轴可视化图表、颜色渐变图)

發布時間:2023/12/10 编程问答 34 豆豆
  • 本文來自《Python數據分析從入門到精通》_明日科技編著

5.6 常用圖表的繪制

  • 本節介紹常用圖表的繪制,主要包括繪制折線圖、繪制柱形圖、繪制直方圖、繪制餅形圖、繪制散點圖、繪制面積圖、繪制熱力圖、繪制箱型圖、繪制3D圖表、繪制多個子圖表以及圖表的保存。對于常用的圖表類型以繪制多種類型圖表進行舉例,以適應不同應用場景的需求。

5.6.1 繪制折線圖

  • 折線圖可以顯示隨時間而變化的連續數據,因此非常適用于顯示在相等時間間隔下數據的趨勢。如基礎體溫曲線圖、學生成績走勢圖、股票月成交量走勢圖,月銷售量統計分析圖、微博、公眾號、網站訪問量統計圖等都可以用折線圖體現。在折線圖中,類別數據沿水平軸均勻分布,所有值數據沿垂直軸均勻分布。
  • Matplotlib繪制折線圖主要使用plot()函數,相信通過前面的學習,您已經了解了plot()函數的基本用法,并能夠繪制一些簡單的折線圖,下面嘗試繪制多折線圖。

繪制學生語數外各科成績分析圖(12)

  • 使用plot()函數繪制多折線圖。例如,繪制學生語數外各科成績分析圖,程序代碼如下:
import pandas as pd import matplotlib.pyplot as plt df1=pd.read_excel('data.xls') #導入Excel文件 df1

#多折線圖 x1=df1['姓名'] y1=df1['語文'] y2=df1['數學'] y3=df1['英語'] plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.rcParams['xtick.direction'] = 'out' #x軸的刻度線向外顯示 plt.rcParams['ytick.direction'] = 'in' #y軸的刻度線向內顯示 plt.title('語數外成績大比拼',fontsize='18') #圖表標題 plt.plot(x1,y1,label='語文',color='r',marker='p') plt.plot(x1,y2,label='數學',color='g',marker='.',mfc='r',ms=8,alpha=0.7) plt.plot(x1,y3,label='英語',color='b',linestyle='-.',marker='*') plt.grid(axis='y') #顯示網格關閉y軸 plt.ylabel('分數') plt.yticks(range(50,150,10)) plt.legend(['語文','數學','英語']) #圖例 plt.savefig('image.png') plt.show()

  • 上述舉例,用到了幾個參數,下面進行說明。
  • mfc:標記的顏色
  • ms:標記的大小
  • mec:標記邊框的顏色
  • alpha:透明度,設置該參數可以改變顏色的深淺

5.6.2 繪制柱形圖

  • 柱形圖,又稱長條圖、柱狀圖、條狀圖等,是一種以長方形的長度為變量的統計圖表。柱形圖用來比較兩個或兩個以上的數據(不同時間或者不同條件),只有一個變量,通常用于較小的數據集分析。
  • Matplotlib繪制柱形圖主要使用bar()函數,語法如下:
matplotlib.pyplot.bar(x,height,width,bottom=None,*,align='center',data=None,**kwargs)
  • x:x軸數據
  • height:柱子的高度,也就是y軸數據
  • width:浮點型,柱子的寬度,默認值為0.8,可以指定固定值
  • bottom:標量或數組,可選參數,柱形圖的y坐標,默認值為None
  • *:星號本身不是參數。星號表示其后面的參數為命名關鍵字參數,命名關鍵字參數必須傳入參數名;否則程序會出現錯誤。
  • align:對齊方式,如center(居中)和edge(邊緣),默認值為center
  • data:data關鍵字參數。如果給定一個數據參數,所有位置和關鍵字參數都將被替換
  • **kwargs:關鍵字參數,其他可選參數,如color(顏色)、alpha(透明度)、label(每個柱子顯示的標簽)等。

4行代碼繪制簡單的柱形圖(13)

import matplotlib.pyplot as plt x=[1,2,3,4,5,6] height=[10,20,30,40,50,60] plt.bar(x,height)

  • bar()函數可以繪制出各種類型的柱形圖,如基本柱形圖、多柱形圖、堆疊柱形圖,只要將bar()函數的主要參數理解透徹,就會達到意想不到的效果。下面介紹幾種常見的柱形圖。

1.基本柱形圖(14)

  • 使用bar()函數繪制“2013-2019年線上圖書銷售額分析圖”,程序代碼如下:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel('books.xlsx') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 x=df['年份'] height=df['銷售額'] plt.grid(axis="y", which="major") # 生成虛線網格 #x、y軸標簽 plt.xlabel('年份') plt.ylabel('線上銷售額(元)')#圖表標題 plt.title('2013-2019年線上圖書銷售額分析圖') plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5,bottom=0.8) #設置每個柱子的文本標簽,format(b,',')格式化銷售額為千位分隔符格式 for a,b in zip(x,height):plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=9,color = 'b',alpha=0.9) #圖例 plt.legend(['銷售額'])

2.多柱形圖 (15)

  • 對于線上圖書銷售額的統計,如果要統計各個平臺的銷售額,可以使用多柱形圖,不同顏色的柱子代表不同的平臺,如京東、天貓、自營等,程序代碼如下:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel('books.xlsx',sheet_name='Sheet2') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼x=df['年份'] y1=df['京東'] y2=df['天貓'] y3=df['自營'] width =0.25 #柱子寬度,若顯示n個柱子,則width值需小于1/n ,否則柱子會出現重疊 #y軸標簽 plt.ylabel('線上銷售額(元)') #圖表標題 plt.title('2013-2019年線上圖書銷售額分析圖') plt.bar(x,y1,width = width,color = 'darkorange') plt.bar(x+width,y2,width = width,color = 'deepskyblue') plt.bar(x+2*width,y3,width = width,color = 'g') #設置每個柱子的文本標簽,format(b,',')格式化銷售額為千位分隔符格式 # plt.text是設置文本的位置 for a,b in zip(x,y1):plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=8) for a,b in zip(x,y2):plt.text(a+width, b,format(b,','), ha='center', va= 'bottom',fontsize=8) for a, b in zip(x, y3):plt.text(a + 2*width, b, format(b, ','), ha='center', va='bottom',fontsize=8) plt.legend(['京東','天貓','自營'])#圖例

5.6.3 繪制直方圖

  • 直方圖,又稱質量分布圖,由一系列高度不等的縱向條紋或線段表示數據分布的情況。一般用橫軸表示數據類型,縱軸表示分布情況。直方圖是數值數據分布的精確圖形表示,是一個連續變量(定量變量)的概率分布的估計。
  • 繪制直方圖主要使用hist()函數,語法如下:
matplotlib.pyplot.hist(x,bin=None,range=None,density=None,bottom=None,histtype='bar',align='mid',bog=False,color=None,labe=None,stacked=False,normed=None)
  • x:數據集,最終的直方圖將對數據集進行統計
  • bins:統計數組的區間分布
  • range:元組類型,顯示的區間
  • density:布爾型,顯示的頻率統計結果,默認值為None。設置值為False,不顯示頻率統計結果;設置值為True,則顯示頻率統計結果。需要統計結果=區間數目/(總數x區間寬度)。
  • histtype:可選參數,設置值為bar、barstacked、step或stepfilled,默認值bar,推薦使用默認配置,其中step使用的是梯狀,stepfilled則會對梯狀內部進行填充,效果與bar類似。
  • align:可選參數,控制柱狀圖的水平分布,設置值為left、mid或right,默認值為mid,其中,left或者right會有部分空白區域,推薦使用默認值。
  • log:布爾型,默認值為False,即y坐標軸是否選擇指數刻度。
  • stacked:布爾型,默認值為False,是否為堆積柱狀圖。

繪制簡單直方圖(16)

import matplotlib.pyplot as plt x=[22,87,5,43,56,73,55,54,11,20,51,5,79,31,27] plt.hist(x, bins = [0,25,50,75,100])

直方圖分析學生數學成績分布情況(17)

import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel('grade1.xls') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 x=df['得分'] plt.xlabel('分數') plt.ylabel('學生數量') # 顯示圖標題 plt.title("高一數學成績分布直方圖") plt.hist(x, bins = [0,25,50,75,100,125,150],facecolor="blue", edgecolor="black", alpha=0.7)

5.6.4 繪制餅形圖

  • 餅形圖常用來顯示各個部分在整體中所占的比例。例如,在工作中如果遇到需要計算總費用或金額的各個部分構成的情況,一般通過各個部分與總額相除來計算,而且這種比例表示方法很抽象,而通過餅形圖將直接顯示各個組成部分所占比例,一目了然。
  • Matplotlib繪制餅形圖主要使用pie()函數,語法如下:
matplotlib.pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=None,radius=None,counterclock=True,wedgeprops=None,textprops=None,center=(0,0),frame=False,rotatelabels=False,hold=None,data=None)
  • x:每一塊餅圖的比例,如果sum(x) > 1會使用sum(x)歸一化。
  • explode:每一塊餅圖離中心的距離。
  • labels:每一塊餅圖外側顯示的說明文字
  • autopct:設置餅圖百分比,可以使用格式化字符串format()函數。如’%1.1f’保留小數點前后1位。
  • pctdistance:類似于labeldistance參數,指定百分比的位置刻度,默認值為0.6
  • shadow:在餅圖下面畫一個陰影,默認值為False,即不畫陰影。
  • labeldistance:標記的繪制位置,相對于半徑的比例,默認值為1.1,如設置值為90則從y軸正方向畫起。
  • radius:餅圖半徑,默認值為1
  • counterclock:指定指針方向,布爾型,可選參數。默認值為True,表示逆時針;如果值為False,則表示順時針
  • wedgeprops:字典類型,可選參數,默認值為None。字典傳遞給wedge對象,用來畫一個餅圖。例如wedgeprops={‘linewidth’:2}設置wedge線寬為2.
  • textprops:設置標簽和比例文字的格式,字典類型,可選參數,默認值為None。傳遞給text對象的字典參數
  • center:浮點類型的列表,可選參數,默認值為(0,0),表示圖表中心位置。
  • frame:布爾型,可選參數,默認值為False,不顯示框架(也就是網絡);如果值為True,則顯示軸框架,與grid()函數配合使用。實際應用中建議使用默認設置,因為顯示軸框架會干擾餅形圖效果。
  • rotatelabels:布爾型,可選參數,默認值為False;如果值為True,則旋轉每個標簽到指定的角度。

繪制簡單餅形圖(18)

import matplotlib.pyplot as plt x = [2,5,12,70,2,9] plt.pie(x,autopct='%1.1f%%')

1.基礎餅形圖(19)

  • 通過餅形圖分析各地區銷量占比情況:
import pandas as pd from matplotlib import pyplot as plt df1 = pd.read_excel('data2.xls') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.figure(figsize=(5,3)) #設置畫布大小 labels = df1['地區'] sizes = df1['銷量'] #設置餅形圖每塊的顏色 colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold'] plt.pie(sizes, #繪圖數據labels=labels,#添加區域水平標簽colors=colors,# 設置餅圖的自定義填充色labeldistance=1.02,#設置各扇形標簽(圖例)與圓心的距離autopct='%.1f%%',# 設置百分比的格式,這里保留一位小數startangle=90,# 設置餅圖的初始角度radius = 0.5, # 設置餅圖的半徑center = (0.2,0.2), # 設置餅圖的原點textprops = {'fontsize':9, 'color':'k'}, # 設置文本標簽的屬性值pctdistance=0.6)# 設置百分比標簽與圓心的距離 # 設置x,y軸刻度一致,保證餅圖為圓形 plt.axis('equal') plt.title('20201月各地區銷量占比情況分析')

2.分裂餅形圖(20)

  • 分裂餅形圖是將您認為主要的餅圖部分分裂出來,以達到突出顯示的目的。
  • 將銷量占比量最多的廣東省分裂顯示,效果如下面第一個圖所示。分裂餅形圖可以同時分裂多塊,如下面第二個圖所示。
import pandas as pd from matplotlib import pyplot as plt df1 = pd.read_excel('data2.xls') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.figure(figsize=(5,3)) #設置畫布大小 labels = df1['地區'] sizes = df1['銷量'] #設置餅形圖每塊的顏色 colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold'] plt.pie(sizes, #繪圖數據labels=labels,#添加區域水平標簽colors=colors,# 設置餅圖的自定義填充色labeldistance=1.02,#設置各扇形標簽(圖例)與圓心的距離autopct='%.1f%%',# 設置百分比的格式,這里保留一位小數startangle=90,# 設置餅圖的初始角度radius = 0.5, # 設置餅圖的半徑center = (0.2,0.2), # 設置餅圖的原點textprops = {'fontsize':9, 'color':'k'}, # 設置文本標簽的屬性值pctdistance=0.6,# 設置百分比標簽與圓心的距離#shadow=True, #陰影explode = (0.1,0,0,0,0,0,0,0,0,0)) #設置分裂餅圖#explode = (0.1,0,0,0,0,0,0,0.1,0.1,0)) #設置多分裂餅圖 # 設置x,y軸刻度一致,保證餅圖為圓形plt.axis('equal') plt.title('20201月各地區銷量占比情況分析')


  • 分裂餅圖主要是通過設置explode參數實現,該參數用于設置餅圖距中心的距離,我們需要將哪塊餅圖分裂出來,就設置它與中心的距離即可。例如,上圖中,我們將占比最多的”廣東省“分裂出來,如上面第二個圖所示。廣東省排在第一位,那么就設置第一位距中心的距離為0.1,其他為0,關鍵代碼如下:
explode = (0.1,0,0,0,0,0,0,0,0,0))

3.立體感帶陰影的餅形圖

  • 立體感帶陰影的餅形圖看起來更美觀,效果如下圖所示:
  • 立體感帶陰影的餅形圖主要通過shadow參數實現,設置該參數值為True即可,主要代碼如下:
shadow=True, #陰影 import pandas as pd from matplotlib import pyplot as plt df1 = pd.read_excel('data2.xls') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.figure(figsize=(5,3)) #設置畫布大小 labels = df1['地區'] sizes = df1['銷量'] #設置餅形圖每塊的顏色 colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold'] plt.pie(sizes, #繪圖數據labels=labels,#添加區域水平標簽colors=colors,# 設置餅圖的自定義填充色labeldistance=1.02,#設置各扇形標簽(圖例)與圓心的距離autopct='%.1f%%',# 設置百分比的格式,這里保留一位小數startangle=90,# 設置餅圖的初始角度radius = 0.5, # 設置餅圖的半徑center = (0.2,0.2), # 設置餅圖的原點textprops = {'fontsize':9, 'color':'k'}, # 設置文本標簽的屬性值pctdistance=0.6,# 設置百分比標簽與圓心的距離shadow=True, #陰影explode = (0.1,0,0,0,0,0,0,0,0,0)) #設置分裂餅圖,本例中第一個數字最大#explode = (0.1,0,0,0,0,0,0,0.1,0.1,0)) #設置多分裂餅圖 # 設置x,y軸刻度一致,保證餅圖為圓形plt.axis('equal') plt.title('20201月各地區銷量占比情況分析')

4.環形圖(21)

  • 環形圖是由兩個及以上大小不一的餅圖在一起,挖去中間的部分所構成的圖形,效果如下:
import pandas as pd from matplotlib import pyplot as plt df1 = pd.read_excel('data2.xls') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.figure(figsize=(5,3)) #設置畫布大小 labels = df1['地區'] sizes = df1['銷量'] #設置餅形圖每塊的顏色 colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold'] plt.pie(sizes, #繪圖數據labels=labels,#添加區域水平標簽colors=colors,# 設置餅圖的自定義填充色autopct='%.1f%%',# 設置百分比的格式,這里保留一位小數#radius =1 , # 設置餅圖的半徑pctdistance=0.85,startangle = 180,textprops = {'fontsize':9, 'color':'k'}, # 設置文本標簽的屬性值wedgeprops = {'width': 0.4, 'edgecolor': 'k'}) plt.title('20201月各地區銷量占比情況分析')

  • 這里還是通過pie()函數實現,一個關鍵參數wedgegroups,字典類型,用于設置餅形圖內、外邊界的屬性,如環的寬度,環邊界顏色和寬度,主要代碼如下:
wedgeprops = {'width': 0.4, 'edgecolor': 'k'}

5.內嵌環形圖(22)

  • 內嵌環形圖實際是雙環形圖,效果如下:
import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] df1 = pd.read_excel('data2.xls') df2=pd.read_excel('data2.xls',sheet_name='2月') #數據集,x1,x2分別對應外環、內環百分比例 x1=df1['銷量'] x2=df2['銷量'] #設置餅狀圖各個區塊的顏色 colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold'] #外環 plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w')) #內環 plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w')) #圖例 legend_text=df1['地區'] plt.legend(legend_text,title='地區',frameon=False,bbox_to_anchor=(0.2,0.5))#設置圖例標題、位置、去掉圖例邊框 plt.axis('equal')#設置坐標軸比例以顯示為圓形 plt.title('20201月和2月各地區銷量占比情況分析')

  • 繪制嵌套環形圖需要注意以下三點:
  • (1)連續使用兩次pie()函數。
  • (2)通過wedgeprops參數設置環形邊界。
  • (3)通過radius參數設置不同的半徑。
  • 另外,由于圖例內容比較長,為了圖例能夠正常顯示,圖例代碼中引入了兩個主要參數,即frameon和bboox_to_anchor。其中,frameon參數設置圖例有無邊框;bbox_to_anchor參數設置圖例位置,主要代碼如下:
#外環 plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w')) #內環 plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w')) #圖例 legend_text=df1['地區'] plt.legend(legend_text,title='地區',frameon=False,bbox_to_anchor=(0.2,0.5))#設置圖例標題、位置、去掉圖例邊框

5.6.5 繪制散點圖

  • 散點圖主要用來查看數據的分布情況或相關性,一般在線性回歸分析中,查看數據點在坐標系平面的分布情況。散點圖表示因變量隨自變量而變化的大致趨勢,據此可以選擇合適的函數對數據進行擬合。
  • 散點圖與折線圖類似,也是一個個點構成的。但不同之處在于,散點圖的各點之間不會按照前后關系以線條連接起來。
  • Matplotlib繪制散點圖使用plot()函數和scatter()函數都可以實現,本節使用scatter()函數繪制散點圖,scatter()函數專門用于繪制散點圖,使用方式和plot()函數類似,區別在于前者具有更高的靈活性,可以單獨控制每個散點與數據匹配,并讓每個散點具有不同的屬性。scatter()函數的語法如下:
matplotlib.pyplot.scatter(x,y,s=None,marker=None,cmap=None,norm=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,data=None,**kwargs)
  • x,y:數據
  • s:標記大小,以平方磅為單位的標記面積,設置值如下。數值標量:以相同的大小繪制所有標記。行或列向量:是每個標記具有不同的大小。x、y和sz中的相應元素確定每個標記的位置和面積。sz的長度必須等于x和y的長度。[]:使用36平方磅的默認面積。
  • c:標記顏色,可選參數,默認標記顏色為藍色
  • marker:標記樣式,可選參數,默認值為’o’
  • cmap:顏色地圖,可選參數,默認值為None
  • norm:可選參數,默認值為None
  • vmin,vmax:標量,可選,默認值為None
  • alpha:透明度,可選參數,0~1的數,表示透明度,默認值為None
  • linewidths:線寬,標記邊緣的寬度,可選參數,默認值為None
  • verts:(x,y)的序列,可選參數,如果參數marker為None,這些頂點將用于構建標記。標記的中心位置為(0,0)
  • edgecolors:輪廓顏色,與參數c類似,可選參數,默認值為None
  • data:data關鍵字參數。如果給定一個數據參數,所有位置和關鍵字參數將被替換
  • **kwargs:關鍵字參數,其他可選參數

繪制簡單散點圖(23)

import matplotlib.pyplot as plt x=[1,2,3,4,5,6] y=[19,24,37,43,55,68] plt.scatter(x, y)

散點圖分析銷售收入與廣告費的相關性(24)

  • 接下來,繪制銷售收入與廣告費散點圖,用以觀察銷售收入與廣告費的相關性:
import pandas as pd import matplotlib.pyplot as plt aa =r'JDdata.xls' bb=r'JDcar.xls' dfaa = pd.DataFrame(pd.read_excel(aa)) dfbb=pd.DataFrame(pd.read_excel(bb)) df1=dfaa[['業務日期','金額']] df2=dfbb[['投放日期','支出']] df1

#去除空日期和金額為0的記錄 df1=df1[df1['業務日期'].notnull() & df1['金額'] !=0] df2=df2[df2['投放日期'].notnull() & df2['支出'] !=0] df1['業務日期'] = pd.to_datetime(df1['業務日期']) df2['投放日期'] = pd.to_datetime(df2['投放日期'])# set_index用法:https://zhuanlan.zhihu.com/p/143839744 dfData = df1.set_index('業務日期',drop=True) #將業務日期設置列設置為索引,并刪掉原來的日期索引列 dfCar=df2.set_index('投放日期',drop=True) dfData

# 按月度統計并顯示銷售金額 dfData_month=dfData.resample('M').sum().to_period('M') # 按月度統計并顯示廣告費支出金額 dfCar_month=dfCar.resample('M').sum().to_period('M') dfData_month

#x為廣告費用,y為銷售收入 x=pd.DataFrame(dfCar_month['支出']) y=pd.DataFrame(dfData_month['金額']) plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.title('銷售收入與廣告費散點圖') #圖表標題 plt.scatter(x, y, color='red') #真實值散點圖

5.6.6 繪制面積圖

  • 面積圖用于體現數量隨時間而變化的程度,也可以用于引起人們對總值趨勢的注意。例如,表示隨時間而變化的利潤的數據可以繪制在面積圖中,以強調總利潤。
  • Matplotlib繪制面積圖主要使用stackplot()函數,語法如下:
matplotlib.pyplot.stackplot(x,*args,data=None,**kwargs)
  • x:x軸數據
  • args:當傳入的參數個數未知時使用args。這里指y軸數據可以傳入多個y軸。
  • data:data關鍵字參數。如果給定一個數據參數,所有位置和關鍵字參數將被替換。
  • **kwargs:關鍵字參數,其他可選參數,如color(顏色)、alpha(透明度)等。

繪制簡單面積圖(25)

import matplotlib.pyplot as plt x = [1,2,3,4,5] y1 =[6,9,5,8,4] y2 = [3,2,5,4,3] y3 =[8,7,8,4,3] y4 = [7,4,6,7,12] plt.stackplot(x, y1,y2,y3,y4, colors=['g','c','r','b'])

  • 面積圖也有很多種,如標準面積圖、堆疊面積圖和百分比堆疊面積圖等。下面主要介紹標準堆疊面積圖。

1.標準面積圖(26)

  • 通過標準面積圖分析2013-2019年線上圖書銷售情況,通過該圖可以看出每一年線上圖書銷售的一個趨勢:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel('books.xlsx') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 x=df['年份'] y=df['銷售額'] #圖表標題 plt.title('2013-2019年線上圖書銷售情況') plt.stackplot(x, y)

2.堆疊面積圖(27)

  • 通過堆疊面積圖分析2013-2019年線上各平臺圖書銷售情況。堆疊圖不僅可以看到各平臺每年銷售變化趨勢,通過將各平臺數據堆疊到一起還可以看到整體的變化趨勢。
  • 實現堆疊面積圖的關鍵在于增加y軸,通過增加多個y軸數據,形成堆疊面積圖,代碼如下:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel('books.xlsx',sheet_name='Sheet2') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 x=df['年份'] y1=df['京東'] y2=df['天貓'] y3=df['自營'] #圖表標題 plt.title('2013-2019年線上圖書銷售情況') plt.stackplot(x, y1,y2,y3,colors=['#6d904f','#fc4f30','#008fd5']) #圖例 plt.legend(['京東','天貓','自營'],loc='upper left')

5.6.7 繪制熱力圖

  • 熱力圖是通過密度函數進行可視化用于表示地圖中的密度的熱圖。它使人們能夠獨立于縮放因子感知點的密度。熱力圖可以顯示不可點擊區域發生的事情。利用熱力圖可以看到數據表里多個特征兩兩的相似度。例如,以特殊高亮的形式顯示訪客熱衷的頁面區域和訪客所在的地理區域的圖示。熱力圖在網頁分析、業務數據分析等其他領域也有較為廣泛的應用。

繪制簡單熱力圖(28)

  • 熱力圖是數據分析的常用方法,通過色差、亮度來展示數據的差異,易于理解。
import matplotlib.pyplot as plt X = [[1,2],[3,4],[5,6],[7,8],[9,10]] plt.imshow(X)

  • 上述代碼中,plt.imshow(X)中傳入的數組X=[[1,2],[3,4],[5,6],[7,8],[9,10]]為顏色的對應值,按照矩陣X進行顏色分布,如左上角顏色為深藍,右下角顏色為黃色,其對應值為10,具體如下:
[1,2] [深藍,藍色] [3,4] [藍綠,深綠] [5,6] [海藻綠,春綠色] [7,8] [綠色,淺綠色] [9,10] [草綠色,黃色]

熱力圖對比分析學生各科成績(29)

  • 根據學生成績統計數據繪制熱力圖,通過熱力圖直觀地對比每名學生各科成績的高低。程序代碼如下:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel('data1.xls',sheet_name='高二一班') plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 X = df.loc[:,"語文":"生物"].values name=df['姓名'] plt.imshow(X) plt.xticks(range(0,6,1),['語文','數學','英語','物理','化學','生物'])#設置x軸刻度標簽 plt.yticks(range(0,12,1),name)#設置y軸刻度標簽 plt.colorbar() #顯示顏色條 plt.title('學生成績統計熱力圖')

  • 從上圖可知,顏色以高亮顯示的,成績越高;反之,成績越低。

5.6.9 繪制箱形圖

  • 箱型圖又稱箱線圖、盒須圖或盒式圖,它是一種顯示一組數據分散情況下的資料的統計圖。因形狀像箱子而得名。箱形圖最大的優點就是不受異常值的影響,可以以一種相對穩定的方式描述數據的離散程度分布情況,因此在各種領域經常被使用。另外,箱形圖也常用于異常值的識別。Matplotlib繪制箱型圖主要使用boxplot()函數,語法如下:
matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,whis=None,positon=None,widths=None,patch_artist=None,meanline=None,showmeans=None,showcaps=None,showbox=None,showfiers=None,boxprops=None,labels=None,flierprops=None,medianprops=None,meanprops=None,capprops=None,whiskerprops=None)
  • x:指定要繪制箱型圖的數據
  • notch:是否以凹口的形式展現箱形圖,默認非凹口
  • sym:指定異常點的形狀,默認為加號(+)顯示
  • vert:是否需要將箱形圖垂直擺放,默認垂直擺放
  • whis:指定上下限于與上下四分位的距離,默認為1.5倍的四分位差。
  • position:指定箱形圖的位置,默認為[0,1,2,…]
  • widths:指定箱形圖的寬度,默認為0.5
  • patch_artist:是否填充箱體的顏色。
  • meanline:是否用線的形式表示均值,默認用點來顯示。
  • showmeans:是否顯示均值,默認不顯示
  • showcaps:是否顯示箱形圖頂端和末端的兩條線,默認顯示。
  • showbox:是否顯示箱形圖的箱體,默認顯示。
  • showfliers:是否顯示異常值,默認顯示。
  • boxprops:設置箱體的屬性,如異常點的形狀、大小、填充色等。
  • medianprops:設置中位數的屬性,如線的類型、粗細等。
  • meanprops:設置均值的屬性,如點的大小、顏色等。
  • capprops:設置箱形圖頂端和末端線條的屬性,如顏色、粗細等。
  • whiskerprops:設置須的屬性,如顏色、粗細等。

繪制簡單箱形圖(30)

import matplotlib.pyplot as plt x=[1,2,3,5,7,9] plt.boxplot(x)

繪制多組數據的箱形圖(31)

  • 上述舉例是一組數據的箱形圖,還可以繪制多組數據的箱形圖,需要指定多組數據。例如,為三組數據繪制箱形圖,程序代碼如下:
import matplotlib.pyplot as plt x1=[1,2,3,5,7,9] x2=[10,22,13,15,8,19] x3=[18,31,18,19,14,29] plt.boxplot([x1,x2,x3])

  • 箱形圖將數據切割分離(實際上就是將數據分為4大部分),如圖5.57所示。
  • 下面介紹箱形圖每部分具體含義以及如何通過箱形圖識別異常值。
  • 下四分位:圖5.57中的下四分位數指的是數據的25%分位點所對應的值(Q1)。計算分位數可以使用Pandas的quantile()函數。例如,Q1=df[‘總消費’].quantile(q=0.25)。
  • 中位數:中位數即為數據的50%分位點所對應的值(Q2)
  • 上四分位數:上四分位數則為數據的75%分位點所對應的值(Q3)
  • 上限:上線的計算公式為Q3+1.5(Q3-Q1)
  • 下限:上線的計算公式為Q1-1.5(Q3-Q1)
  • 其中Q3-Q1表示四分位差。如果使用箱形圖識別異常值,其判斷標準是,當變量的數據值大于箱形圖的上限或者小于箱形圖的下限時,就可以將這樣的數據判定為異常值。
  • 下面了解以下判斷異常值的算法,如圖5.58所示。

通過箱形圖判斷異常值(32)

  • 通過箱形圖查找客人總消費數據中存在的異常值,程序代碼如下:
import matplotlib.pyplot as plt import pandas as pd df=pd.read_excel('tips.xlsx') plt.boxplot(x = df['總消費'], # 指定繪制箱線圖的數據whis = 1.5, # 指定1.5倍的四分位差widths = 0.3, #指定箱線圖中箱子的寬度為0.3patch_artist = True, #填充箱子顏色showmeans = True, #顯示均值boxprops = {'facecolor':'RoyalBlue'}, # 指定箱子的填充色為寶藍色flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':3}, # 指定異常值的填充色、邊框色和大小meanprops = {'marker':'h','markerfacecolor':'black', 'markersize':8},# 指定均值點的標記符號(六邊形)、填充色和大小medianprops = {'linestyle':'--','color':'orange'}, # 指定中位數的標記符號(虛線)和顏色labels = ['']) # 去除x軸刻度值# 計算下四分位數和上四分位 Q1 = df['總消費'].quantile(q = 0.25) Q3 = df['總消費'].quantile(q = 0.75) # 基于1.5倍的四分位差計算上下限對應的值 low_limit = Q1 - 1.5*(Q3 - Q1) up_limit = Q3 + 1.5*(Q3 - Q1) # 查找異常值 val=df['總消費'][(df['總消費'] > up_limit) | (df['總消費'] < low_limit)] print('異常值如下:') print(val)


5.6.9 繪制3D圖表

  • 3D圖表有立體感也比較美觀,看起來更加“高大上”。下面介紹兩種3D圖表,即三維柱形圖和三維曲面圖。
  • 繪制3D圖表,我們仍使用Matplotlib,但需要安裝mpl_toolkits工具包,使用pip安裝命令:
pip install -upgrade matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 安裝好這個模塊后,即可調用mpl_tookits下的mplot3d類進行3D圖表的繪制。

1. 3D柱形圖(33)

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D import numpy as np fig = plt.figure() axes3d = Axes3D(fig) zs = [1, 5, 10, 15, 20] for z in zs:x = np.arange(0, 10)y = np.random.randint(0, 30, size=10)axes3d.bar(x, y, zs=z, zdir='x', color=['r', 'green', 'yellow', 'c'])

2. 3D曲面圖(34)

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) delta = 0.125 # 生成代表X軸數據的列表 x = np.arange(-4.0, 4.0, delta) # 生成代表Y軸數據的列表 y = np.arange(-3.0, 4.0, delta) # 對x、y數據執行網格化 X, Y = np.meshgrid(x, y) Z1 = np.exp(-X**2 - Y**2) Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2) # 計算Z軸數據(高度數據) Z = (Z1 - Z2) * 2 # 繪制3D圖形 ax.plot_surface(X, Y, Z,rstride=1, # rstride(row)指定行的跨度cstride=1, # cstride(column)指定列的跨度cmap=plt.get_cmap('rainbow')) # 設置顏色映射 # 設置Z軸范圍 ax.set_zlim(-2, 2)

5.6.10 繪制多個圖表

  • Matplotlib可以實現在一張圖表上繪制多個子圖表。Matplotlib提供了3種方法:一是subplot()函數;二是subplots()函數;三是add_subplots()函數,下面分別介紹:

1.subplot()函數

  • subplot()函數直接指定劃分方式和位置,它可以將一個繪圖區域劃分為n個子圖,每個subplot()函數只能繪制一個子圖。語法如下:
matplotlib.pyplot.subplot(*args,**kwargs)
  • args:當傳入的參數個數未知時使用args
  • **kwargs:關鍵字參數,其他可選參數
  • 例如,繪制一個2x3的區域,subplot(2,3,3),將畫布分成2行3列在第3個區域中繪制,用坐標表示如下:
(1,1),(1,2),(1,3) (2,1),(2,2),(2,3)
  • 如果行列的值都小于10,那么可以把它們縮寫成一個整數,如subplot(233)。
  • 另外,subplot()函數在指定的區域中創建一個軸對象,如果新創建的軸和之前所創建的軸重疊,那么,之前的軸將被刪除。
使用subplot()函數繪制多個子圖的空圖表(35)
  • 繪制一個2x3包含6個子圖的空圖表,程序代碼如下:
import matplotlib.pyplot as plt plt.subplot(2,3,1) plt.subplot(2,3,2) plt.subplot(2,3,3) plt.subplot(2,3,4) plt.subplot(2,3,5) plt.subplot(2,3,6)

繪制包含多個子圖的圖表(36)
  • 通過上述舉例了解了subplot()函數的基本用法,接下來將前面所學的簡單圖表整合到一張圖表上,結果如下圖所示:
import matplotlib.pyplot as plt #第1個子圖表-折線圖 plt.subplot(2,2,1) plt.plot([1, 2, 3, 4,5]) #第2個子圖表-散點圖 plt.subplot(2,2,2) plt.plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro') #第3個子圖表-柱形圖 plt.subplot(2,1,2) x=[1,2,3,4,5,6] height=[10,20,30,40,50,60] plt.bar(x,height)
圖5.65
  • 上述舉例,以下兩個關鍵點一定要掌握。
  • (1)每繪制一個子圖表都要調用一次subplot()函數
  • (2)繪圖區域位置編號
  • subplot()函數的前面兩個參數指定的是一個畫布被分割成的行數和列數,后面一個參數則指的是當前繪制區域位置編號,編號規則是行優先。
  • 例如,圖5.64中有3個子圖表,第1個子圖表subplot(2,2,1),即將畫布分成2行2列,在第1個子圖中繪制折線圖;第二子圖表subplot(2,2,2),將畫布分成2行2列,在第二個子圖中繪制散點圖;第3個子圖表subplot(2,1,2),將畫布分成2行1列,由于第1行已經占用了,所以在第2行也就是第3個子圖中繪制柱形圖。示意圖如圖5.65所示。
  • subplot()函數在畫布中繪圖時,每次都要調用它指定繪圖區域非常麻煩,而subplots()函數則更直接,它會事先把畫布區域分割好。下面介紹subplots()函數。

2.subplots()函數

  • subplots()函數用于創建畫布和子圖,語法如下:
matplotlib.pyplot.subplots(nrows,ncols,sharex,sharey,squeeze,subplot_kw,gridspec_kw,**fig_kw)
  • nrows和ncols:表示將畫布分割成幾行幾列,例如,nrows=2、ncols=2表示將畫布分割成2行2列,起始值均為0。當調用畫布中的坐標軸時,ax[0,0]表示調用左上角的坐標,ax[1,1]表示調用右下角的坐標。
  • sharex和sharey:布爾值或者值為“none”“all”“row”“col”,默認值為False。用于控制x或y軸之間的屬性共享。具體參數值說明如下。
    – True或者“all”:表示x或y軸屬性在所有子圖中共享。
    – False或者“none”:表示每個子圖的x或y軸都是獨立的部分。
    – row:表示每個子圖在一個x或y軸上共享行(row)
    – col:表示每個子圖在一個x或y軸上共享列(column)
  • squeeze:布爾值,默認值為True,額外的維度從返回的axes(軸)對象中擠出,對應nx1或1xn個子圖,返回一個一維數組,對于nxm,n>1和m>1返回一個二維數組;如果值為False,則表示不進行擠壓操作,返回一個元素為Axes實例的二維數組,即使它最終是1x1
  • subplot_kw:字典類型,可選參數。把字典的關鍵字傳遞給add_subplot()函數來創建每個子圖。
  • gridspec_kw:字典類型,可選參數。把字典的關鍵字傳遞給GridSpec()構造函數創建網格區域,然后將子圖放在網格(grid)里。
  • **fig_kw:把所有詳細的關鍵字參數傳遞給figure

使用subplots()函數繪制多子圖的空圖表(37)

  • 繪制一個2x3包含6個子圖的空圖表,使用subplots()函數只需3行代碼:
import matplotlib.pyplot as plt figure,axes=plt.subplots(2,3)

  • 上述代碼中,figure和axes是兩個關鍵點。
  • figure:繪制圖表的畫布。
  • axes:坐標軸對象,可以理解為在figure(畫布)上繪制坐標軸對象,它幫我們規劃出了一個科學作圖的坐標軸系統。
  • 通過上面可以明白,外面的是畫布(figure),里面帶坐標軸的是坐標軸對象(axes)。

使用subplots()函數繪制多子圖圖表(38)

  • 使用subplots()函數將前面所學的簡單圖表整合到一張圖表上,結果如圖所示:
import matplotlib.pyplot as plt figure,axes=plt.subplots(2,2) axes[0,0].plot([1, 2, 3, 4,5]) #折線圖 axes[0,1].plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')#散點圖 #柱形圖 x=[1,2,3,4,5,6] height=[10,20,30,40,50,60] axes[1,0].bar(x,height) #餅形圖 x = [2,5,12,70,2,9] axes[1,1].pie(x,autopct='%1.1f%%')

3.add_subplot()函數

  • add_subplot()函數也可以實現在一張圖上繪制多個子圖表,用法與subplot()基本相同,先來看下列一段代碼:
import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(2,3,1) ax2 = fig.add_subplot(2,3,2) ax3 = fig.add_subplot(2,3,3) ax4 = fig.add_subplot(2,3,4) ax5 = fig.add_subplot(2,3,5) ax6 = fig.add_subplot(2,3,6)
  • 上述代碼同樣是繪制一個2x3包含6個子圖的空圖表。首先創建一個figure實例(畫布),然后通過ax1=fig.add_subplot(2,3,1)創建第1個子圖表,返回Axes實例(坐標軸對象),第1個參數為行數,第2個參數為列數,第3個參數為子圖表的位置。
  • 以上用3中方法實現了在一張圖上繪制多個子圖表,3中方法各有所長。subplot()函數和add_subplot()函數比較靈活,定制化效果比較好,可以實現子圖表在圖中的各種布局(如一張圖上可以隨意擺放3個或5個圖表);而subplots()函數較為不靈活,但它可以用較少的代碼實現繪制多個子圖表。

5.6.11 圖表的保存

  • 實際工作中,有時需要將繪制的圖表保存為圖片放置到報告中。Matplotlib的savefig()函數可以實現這一功能,將圖表保存為JPEG、TIFF或PNG格式的圖片。
  • 例如,保存之前繪制的折線圖,主要代碼如下:
plt.savefig('image.png')
  • 需要注意一個關鍵問題,保存代碼必須在圖表預覽前,也就是plt.show()代碼前;否則保存后的圖片是白色,圖表無法保存。

5.7 綜合應用

5.7.1 雙y軸可視化數據分析圖表的實現

  • 雙y軸顧名思義就是兩個y軸,其特點是通過雙y軸看出發展情況的同時還可以看到其增長速度。對于產品而言,通過此圖可以看到產品銷量的同時還可以看到產品增長率,效果如下:
import pandas as pd import matplotlib.pyplot as plt df=pd.read_excel('mrbook.xlsx') #導入Excel文件 x=[1,2,3,4,5,6] y1=df['銷量'] y2=df['rate'] fig = plt.figure() plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號 ax1 = fig.add_subplot(111) #添加子圖 plt.title('銷量情況對比') #圖表標題 #圖表x軸標題 plt.xticks(x,['1月','2月','3月','4月','5月','6月']) ax1.bar(x,y1,label='銷量') lin1=ax1.legend(('銷量',)) #設置圖例 ax1.set_ylabel('銷量(冊)') #y軸標簽 ax2 = ax1.twinx() #共享x軸添加一條y軸坐標軸 ax2.plot(x,y2,color='black',linestyle='--',marker='o',linewidth=2,label='增長率') ax2.set_ylabel('增長率') lin2=ax2.legend(('增長率',)) for a,b in zip(x,y2):plt.text(a, b+0.02, '%.2f' % b, ha='center', va= 'bottom',fontsize=10,color='red') plt.show()

5.7.2 顏色漸變餅形圖的實現

from matplotlib import font_manager as fm import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.style.use('ggplot') #設置背景樣式,https://blog.csdn.net/qq_22592457/article/details/105636480 from matplotlib import cm #原始數據 shapes = ['天津', '江西省', '安徽省', '云南省', '福建省', '河南省', '遼寧省','重慶', '湖南省', '四川省', '北京', '上海', '廣西壯族自治區', '河北省','浙江省', '江蘇省', '湖北省', '山東省', '廣東省'] values = [287,383,842,866,1187,1405,1495,1620,1717,2313,2378,3070,4332,5841,6482,7785,9358,9818,20254] explode=[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] s = pd.Series(values, index=shapes) labels = s.index sizes = s.values fig, ax = plt.subplots(figsize=(6,6)) # 設置繪圖區域大小 # 繪制彩虹圖,https://blog.csdn.net/weixin_48964486/article/details/124144183 colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # 顏色地圖:秋天→彩虹→灰色→春天→黑色 patches, texts, autotexts = ax.pie(sizes, labels=labels, autopct='%1.0f%%',shadow=False, startangle=170, colors=colors) ax.axis('equal') ax.set_title('各地區線上圖書銷售占比圖',loc='left') # 重新設置字體大小 proptease = fm.FontProperties() # 字體大小(從小到大): xx-small、x-small、small、medium、large、x-large、xx-large,或者是數字,如18 proptease.set_size('small') plt.setp(autotexts, fontproperties=proptease) plt.setp(texts, fontproperties=proptease) plt.show()

  • 如果畫分裂餅形圖,可在本文搜索關鍵詞“分裂餅形圖”。
  • 顏色漸變主要使用了Matplotlib內置顏色地圖模塊cm,在該模塊中指定一組數據可以生成多種顏色,由淺入深。例如,漸變藍色,cmap=plt.cm.Blues。

5.7.3 等高線圖的實現

  • 等高線圖是地理課中講述山峰山谷時繪制的圖形,在機器學習中也會被用在繪制梯度下降算法的圖形中。等高線圖實現結果如下圖所示:
import numpy as np import matplotlib.pyplot as plt # 計算x,y坐標對應的高度值 def f(x, y):return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2) # 生成x,y的數據 n = 256 x = np.linspace(-3, 3, n) y = np.linspace(-3, 3, n) # 把x,y數據轉換為二維數據 X, Y = np.meshgrid(x, y) # 填充等高線 plt.contourf(X, Y, f(X, Y)) # 顯示圖表 plt.show()

  • 關鍵代碼解析:需畫出等高線,核心函數是Matplotlib的coutourf()函數,但該函數中參數x和y對應的值是二維數據,因此需要使用NumPy的meshgrid()函數將x和y值轉換成二維數據,代碼如下:
np.meshgrid(x,y)

5.8 小 節

  • 數據統計的再好都不如一張圖表清晰、直觀。本章用大量的舉例詳細地介紹了Matplotlib圖表,其根本在于能夠使讀者全面透徹地了解和掌握最基礎的圖表,并應用到實際數據統計工作中,同時也為以后學習其他繪圖庫奠定堅實的基礎。

總結

以上是生活随笔為你收集整理的Matplotlib可视化数据分析图表下(常用图表的绘制、折线图、柱形图、直方图、饼形图、散点图、面积图、热力图、箱形图、3D图表、绘制多个图表、双y轴可视化图表、颜色渐变图)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。