Python 数据分析 —— Matplotlib ①
文章目錄
- Matplotlib 基礎
- plt.show() 函數
- plt.plot() 函數
- 基本用法
- 用字符參數設置線條屬性
- 顯示范圍
- 傳入 Numpy 數組
- 傳入多組數據
- 用其他參數設置線條屬性
- 用 plt.plot() 的返回值來設置線條屬性
- 用 plt.setp() 修改線條屬性
- 子圖
- 實戰練習:電影數據繪圖
- plt.bar() —— 柱狀圖的繪制
- plt.plot() —— 曲線圖的繪制
- plt.pie() —— 餅圖的繪制
- plt.hist() —— 直方圖的繪制
- 作業
??
??
??
??
Matplotlib 基礎
??
??
matplotlib 是一個 Python 的 2D 圖形包。pyplot 封裝了很多畫圖的函數。
??
導入相關的包:
import matplotlib.pyplot as plt import numpy as np??
matplotlib.pyplot 包含一系列類似 MATLAB 中繪圖函數的相關函數。每個 matplotlib.pyplot 中的函數對當前的圖像進行一些修改,例如:產生新的圖像,在圖像中產生新的繪圖區域,在繪圖區域中畫線,給繪圖加上標記,等等… matplotlib.pyplot 會自動記住當前的圖像和繪圖區域,因此這些函數會直接作用在當前的圖像上。
在實際的使用過程中,常以 plt 作為 matplotlib.pyplot 的省略。
??
??
??
??
plt.show() 函數
??
??
默認情況下,matplotlib.pyplot 不會直接顯示圖像,只有調用 plt.show() 函數時,圖像才會顯示出來。
類似 print()
plt.show() 默認是在新窗口打開一幅圖像,并且提供了對圖像進行操作的按鈕。
??
??
??
??
plt.plot() 函數
??
plt.plot()函數是 matplotlib.pyplot 模塊下的一個函數, 用于畫圖。
它可以繪制 點圖 和 線圖 ,并且對其樣式進行控制
??
??
基本用法
??
(1)默認參數
y軸元素是必須要指定的。x軸元素如果不指定,默認為y軸元素的索引(0、1、2、3…)。
- plt.plot (y)
??
??
(2)指定x和y
- plt.plot (x,y)
??
??
(3)給x軸和y軸命名
- plt.xlabel (‘名字’)
- plt.ylabel (‘名字’)
??
注意:如果名字含中文的話,需要加上一個設置:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 把中文設成黑體如果不加這句,中文就是亂碼
??
??
??
用字符參數設置線條屬性
??
這些參數都可以用在各種圖形的繪制中。
??
可以用字符來指定線條的屬性,即繪制圖像時,線的樣子。
??
表示顏色的字符參數:
| ‘b’ | blue,藍色 |
| ‘g’ | green,綠色 |
| ‘r’ | red,紅色 |
| ‘c’ | cyan,青色 |
| ‘m’ | magenta,品紅 |
| ‘y’ | yellow,黃色 |
| ‘k’ | black,黑色 |
| ‘w’ | white,白色 |
??
表示類型(樣子)的字符參數:
| ‘-’ | 實線 | ‘–’ | 虛線 |
| ‘-.’ | 虛點線 | ‘:’ | 點線 |
| ‘.’ | 點 | ‘,’ | 像素點 |
| ‘^’ | 上三角點 | ‘v’ | 下三角點 |
| ‘<’ | 左三角點 | ‘>’ | 右三角點 |
| ‘1’ | 下三叉點 | ‘2’ | 上三叉點 |
| ‘3’ | 左三叉點 | ‘4’ | 右三叉點 |
| ‘o’ | 原點 | ‘s’ | 正方點 |
| ‘p’ | 五角點 | ‘*’ | 星形點 |
| ‘h’ | 六邊形點1 | ‘H’ | 六邊形點2 |
| ‘+’ | 加號點 | ‘x’ | 乘號點 |
| ‘D’ | 實心菱形點 | ‘d’ | 瘦菱形點 |
| ‘_’ | 橫斷點 |
??
練習:用品紅虛線畫圖
plt.plot([1,2,3,4],[1,4,9,16],'--m')可以看出,起始點和終點都在圖像的邊緣,不太好看。因此需要改變軸的顯示范圍,讓圖變好看。
??
??
??
顯示范圍
??
使用 axis 函數指定坐標軸的顯示范圍:
- plt.axis ([ xmin,xmax,ymin,ymax ])
??
plt.plot([1,2,3,4],[1,4,9,16],'--m') plt.axis([0,6,0,20])??
??
??
傳入 Numpy 數組
??
之前傳給 plot 的參數都是列表。實際上,向 plot 中傳入 numpy 數組是更常用的做法。
PS:如果傳入的是列表,matplotlib 會在內部將它轉化成數組再進行處理。
t = np.arange(0,5,0.2) # 構造 numpy 數組 plt.plot(t,t,'r--') # 把numpy傳給plot??
??
??
傳入多組數據
??
我們不需要使用多個 plot 函數來畫多組數據,只需要將這些組合放到一個 plot 函數中去即可。
通過傳入多組 (x,y,格式) 參數,使多個 plot 函數在同一張圖上顯示。
??
??
在一個圖里面畫多條線:
格式 :plt.plot(x,y,格式,x,y,格式,x,y,格式,…)
??
1.先構造一個 numpy 數組
t = np.arange(0,5,0.2)
??
2.多條線之間用逗號(,)隔開
plt.plot(t,t,'r--', t,t*t,'g*', t,t**3,'c^')??
??
??
用其他參數設置線條屬性
??
這些參數都可以用在各種圖形的繪制中。
??
之前提到,可以用字符串指定線條的屬性。事實上還可以通過 關鍵字 來改變線條的屬性。例如: linewidth 可以改變線條的寬度,color 可以改變線條的顏色 。
??
x = np.linspace(-np.pi,np.pi) y = np.sin(x) plt.plot(x,y,linewidth = 4,color = 'c')??
??
??
用 plt.plot() 的返回值來設置線條屬性
??
plot 函數返回一個 Line2D 對象組成的列表,每個對象代表輸入的一對組合,例如:
-
line1,line2 為兩個 Line2D 對象
??
line1,line2 = plt.plot (x1,y1,x2,y2) -
返回 多個 Line2D 對象組成的列表
??
lines = plt.plot (x1,y1,x2,y2,x3,y3,…)
PS :只能給對象進行屬性設置;不能對列表進行屬性設置!
??
使用返回值設置線條屬性:
# line1 和 line2 就是返回值 line1,line2 = plt.plot(x,y,'r',x,y+1) # 紅色line1,藍色line2 line1.set_antialiased(False) # 關閉抗鋸齒,不平滑了??
PS :不能對列表進行屬性設置!
會報錯:
AttributeError: ‘list’ object has no attribute ‘set_antialiased’
??
但可以從列表中取對象:
??
??
??
用 plt.setp() 修改線條屬性
??
更方便的做法是使用: plt 的 setp 函數 。
line = plt.plot(x,y) plt.setp(line,color = 'g',linewidth = 4)??
??
??
??
子圖
??
??
figure 函數會產生一個指定編號為 num(具體數字)的主圖(畫布) :
plt.figure(num)??
如果 num = 1,即 figure(1) 時可以省略,因為默認 plt 會產生一幅圖 。
PS :如果繪制多張圖,編號num才有用呢,給不同圖賦編號嘛。如果就畫一張圖,那就沒必要專門設置 num了。
多個figure就是多個圖。每個圖都可能包含一個或多個子圖。
??
也可以用 figsize 參數定義圖片的大小:
plt.figure(figsize = (10,6))figure圖大小 :長10寬6
??
??
subplot 函數可以在 一幅圖(一個figure對象/一張畫布)中生成多個子圖:
plt.subplot(numRows,numCols,plotNum)??
注意:
如果3個參數都是一位數,那么中間的逗號(,)可以省略。因此,plt.subplot (2,1,1) 就可以簡寫成plt.subplot (211) 。參數意思是:圖像是 2 x 1(2行1列)的,且當前選中的是兩個 subplot 中的第1個。
??
參數:
- numRows :表示將整個繪圖區域等分為numRows行
- numCols :表示將整個繪圖區域等分為numCols列
- plotNum :表示當前選中要操作的區域
幾行幾列第幾個子圖
??
??
??
??
??
實戰練習:電影數據繪圖
??
??
在了解了繪圖的基礎知識后,終于可以對電影數據進行可視化分析了!
??
前提工作:
1.導入庫
import numpy as np import pandas as pd import matplotlib.pyplot as plt??
2.去除警告
??
3.解決中文亂碼等問題
??
4.讀入數據
??
??
??
plt.bar() —— 柱狀圖的繪制
??
柱狀圖(bar chart),是一種以長方形的長度為變量的表達圖形的統計報告圖,由一系列高度不等的縱向條紋表示數據分布的情況,用來比較兩個或以上的價值(不同時間或不同條件),只有一個變量,通常用于較小的數據集分析。柱狀圖也可以橫向排列,或用多維方式表達。
??
增添細節:
- plt.title :設置圖的標題(寫的這些都可加fontsize設置字體大小)
- plt.xlabel :設置x軸名字
- plt.ylabel :設置y軸名字
- plt.tick_params(labelsize = 14) :坐標軸上字體大小
- plt.xticks(rotation = 90) :把字旋轉多少度(此時為90°)。x軸上的字都擠在一起了,把字豎著寫好看
- plt.text(數據放的x軸位置,數據放的y軸位置,放上面的數據,ha = xxx,…) :把數字顯示在柱上,如果想要每個柱子都顯示就得用循環。ha參數:對齊方式。
- plt.grid :圖上加網格線
- …還有很多,常用的有這些,其他沒記的用的時候再查
??
補充:
value_counts() 是?種查看表格某列中有多少個不同值的快捷方法,并計算每個不同值有在該列中有多少重復值 。
??
??
繪制每個產地的電影數量的柱狀圖
??
1.先取得數據:
data = df['產地'].value_counts()??
2.再繪制圖形:
x = data.index # 地區做x軸 y = data.values # 電影數量做y軸plt.figure(figsize = (15,8)) # 先把畫布大小設置好 plt.bar(x,y,color = 'c')plt.title('各產地電影數量',fontsize = 20) # 設置圖的標題(fontsize是字體大小) plt.xlabel('產地',fontsize = 18) # x軸名字 plt.ylabel('電影數量',fontsize = 18) # y軸名字 plt.tick_params(labelsize = 14) # 坐標軸上字體大小 plt.xticks(rotation = 90) # 把字旋轉多少度。x軸上的字都擠在一起了,把字豎著寫# 把數字顯示在柱上(每個柱子都顯示就得用循環) for a,b in zip(x,y):plt.text(a,b+100,b,ha = 'center',fontsize = 10) # (數據放的x軸位置,數據放的y軸位置,放上面的數據) # b+100解釋:數據緊貼著柱不好看,就放在柱上面一點 # ha參數:水平對其方式??
??
??
plt.plot() —— 曲線圖的繪制
??
曲線圖又稱 折線圖 ,是利用曲線的升、降變化來表示被研究現象發展變化趨勢的一種圖形。它在分析研究社會經濟現象的發展變化、依存關系等方面具有重要作用。
??
依然用 plt.plot
??
增添細節:
- plt.title :設置圖的標題(寫的這些都可加fontsize設置字體大小)
- plt.xlabel :設置x軸名字
- plt.ylabel :設置y軸名字
- plt.text :在指定位置放入文字
??
除了使用 text 在指定位置標上文字之外,還可以使用 plt.annotate 函數進行注釋,
plt.annotate 主要有兩個參數:
- xy :被注釋的坐標點。
- xytext :注釋文字的坐標位置。
- arrowprops :設置箭頭的樣子。參數類型為字典。facecolor:內部顏色,edgecolor:邊緣顏色,…
??
??
繪制1888到2015年的電影數量的折線圖
??
1.把2016年數據剔除,只保留1888-2015年的數據
# 統計各個年份的電影數據 data = df['年代'].value_counts()
??
??
??
2.繪制圖形:
x = data.index # 年代做x軸 y = data.values # 電影數量做y軸plt.figure(figsize = (15,8)) # 先把畫布大小設置好 plt.plot(x,y,color = 'c')plt.title('各年代電影數量',fontsize = 20) # 設置圖的標題(fontsize是字體大小) plt.xlabel('年代',fontsize = 18) # x軸名字 plt.ylabel('電影數量',fontsize = 18) # y軸名字 plt.tick_params(labelsize = 14) # 坐標軸上字體大小# 把每隔10年的數據寫在圖上 for a,b in zip(x[::10],y[::10]):plt.text(a,b+50,b,ha = 'center',fontsize = 10) # (數據放的x軸位置,數據放的y軸位置,放上面的數據) # b+100解釋:數據緊貼著柱不好看,就放在柱上面一點 # ha參數:水平對其方式# 加注釋 # arrowprops要用字典傳參 plt.annotate('2012年達到最大值',xy = (2012,data[2012]),xytext = (2025,2100),arrowprops = {'facecolor':'yellow','edgecolor':'magenta'})# 在折線圖陡峭的地方加一段話 plt.text(1980,1000,'電影數量開始快速增長',fontsize = 13)從上圖可以看出,電影數量是逐年增加的,增長的趨勢在2000年后變得飛快。
??
??
??
plt.pie() —— 餅圖的繪制
??
餅圖 常用于統計學模塊。2D餅圖為圓形。適用于分類不多的數據。
僅排列在工作表的一列或一行中的數據可以繪制到餅圖中。餅圖顯示一個數據系列中各項的大小與各項總和的比例。餅圖中的數據點顯示為整個餅圖的百分比。
PS :
數據系列:
在圖表中繪制的相關數據點,這些數據源自數據表的行或列。圖表中的每個數據系列具有唯一的顏色或圖案,并且在圖表的圖例中表示。可以在圖表中繪制一個或多個數據系列。餅圖只有一個數據系列。
數據點:
在圖表中繪制的單個值,這些值由條形、柱形、折線、餅圖、或圓環圖的扇面、圓點和其他被稱為數據標記的圖形表示。相同顏色的數據標記組成一個數據系列。
??
plt.pie 餅圖用的函數:
plt.pie(x, explode = None, labels = None, colors = None, autopct = None, pctdistance = 0.6,shadow = False, labeldistance = 1.1, startangle = None, radius = None)??
參數:
- x :數組。表示每一塊的比例,如果 sum(x) > 1 會使 sum(x) 歸一化。
- explode :數組。每一塊離開中心的距離。
- labels :列表。餅圖外側,每一塊餅塊顯示的說明文字。
- color :數組。用來標注每塊餅圖的matplotlib顏色參數序列。默認為為None,將使用當前活動環的顏色。
- autopct :控制餅圖內百分比設置,可以使用format字符串或format function。
- pctdistance :指定 autopct 的位置刻度。
- shadow :在餅圖下面畫個陰影。
- labeldistance :繪制位置。相對于半徑的比例,如果 <1 則繪制在餅圖內側。
- startangle :起始繪制角度,默認圖是從x軸正方向逆時針畫起。如果設定 =90,則從y軸正方向畫起。
- radius :控制餅圖的半徑。
??
返回值:
- 如果沒有設置 autopct :返回(patches,texts)
- 如果設置了 autopct :返回(patches,texts,autotexts)
??
??
根據電影時長繪制餅圖
??
1.把數據先搞出來
data = pd.cut(df['時長'],[0,60,90,110,1000]) data = data.value_counts()??
2.繪制圖形:
x = data.index y = data.values # y = data.values/sum(data.values) 餅圖得用百分比表示。但這一步可有可無,數據會自動轉化位百分比plt.figure(figsize = (10,10)) # 注意:餅圖的長寬要一致!!! plt.title('電影時長占比',fontsize = 15)# 通過函數返回值定義圖像的字體 l_text:餅圖外部的文字 p_text:餅圖內部的文字 patches,l_text,p_text = plt.pie(y,labels = x,autopct = '%.1f %%',colors = 'bcmy',startangle = 90) # 這里注意是 colors # f表示浮點數,.1表示1位。前后都必須加 %,有百分號%才意味著在進行格式的說明。倒數第二個百分號意味著是百分比數 # startangle 讓圖從y軸正方向開始畫# 利用返回值,設置餅圖內部的字體 for i in p_text:i.set_size(15) # 內部字體大小i.set_color('w') # 內部字體顏色for i in l_text:i.set_size(18) # 外部字體大小i.set_color('r') # 外部字體顏色plt.legend() # 加上圖例??
??
??
plt.hist() —— 直方圖的繪制
??
直方圖 又稱質量分布圖。是一種統計報告圖,由一系列高度不等的縱向條紋或線段表示數據分布的情況。一般用橫軸表示數據類型,縱軸表示分布情況。
直方圖是數值數據分布的精確圖形表示。是一個連續變量(定量變量)的概率分布的估計。是一種條形圖。
構造直方圖,第一步是將值的范圍分段,即將整個值的范圍分成一系列間隔。第二部是計算每個間隔中有多少值。這些值通常被指定為連續的,不重疊的變量間隔。間隔必須相鄰,并且通常是相等的大小(但不是必須的)。
直方圖也可以被歸一化以顯示 “相對” 頻率。歸一化之后,它顯示了屬于幾個類別中的每個案例的比例,其高度等于1.
??
參數:
hist 的參數非常多,但常用的就這幾個,只有第一個是必須的,后面都可選填。
- arr :需要計算直方圖的一維數組。如果是多維數組,可以先進行扁平化再作圖。必填參數!
- bins :直方圖的柱數,默認為10。
- normed :是否將得到的直方圖向量歸一化。默認為0。
- facecolor :直方圖顏色。
- edgecolor :直方圖邊框顏色。
- alpha :透明度。取值在 0-1 之間。
- histtype :直方圖類型,可選項有:bar,barstacked,stepstepfilled 。
??
返回值:
- n :直方圖向量,是否歸一化由參數 normed 設定。
- bins :返回各個bin的區間范圍。
- patches :返回每個bin里面包含的數據,是一個列表。
??
??
根據電影評分繪制頻率分布直方圖
??
??
??
??
??
作業
??
??
(1)畫出 y = x2 + 2x + 1 在區間 [-1,3] 的函數圖像
x = np.linspace(-1,3,50) y = x**2 + 2*x + 1 plt.figure(figsize = (10,6)) plt.plot(x,y) plt.title('二次函數',fontsize = 20) plt.xlabel('x軸',fontsize = 18) plt.ylabel('y軸',fontsize = 18) plt.tick_params(labelsize = 15) # 坐標軸上字體大小??
(2)在同一張圖中創建兩個子圖,分別畫出 sin(x) 和 cos(x) 在 [-3.14,3.14] 上的函數圖像。設置線條寬度為2.5
x = np.linspace(-3.14,3.14,50) y1 = np.sin(x) y2 = np.cos(x)plt.figure(figsize = (18,6))plt.subplot(1,2,1) plt.plot(x,y1,linewidth = 2.5) plt.title('sin(x)',fontsize = 20) plt.xlabel('x軸',fontsize = 18) plt.ylabel('y軸',fontsize = 18) plt.tick_params(labelsize = 15) # 坐標軸上字體大小plt.subplot(1,2,2) plt.plot(x,y2,linewidth = 2.5) plt.title('cos(x)',fontsize = 20) plt.xlabel('x軸',fontsize = 18) plt.ylabel('y軸',fontsize = 18) plt.tick_params(labelsize = 15) # 坐標軸上字體大小??
(3)讀取上次作業保存的酒店數據,畫出每個地區酒店數量的柱狀圖,柱狀顏色為紅色
df = pd.read_excel(r'D:\數據分析\酒店數據2.xlsx') data = df.地區.value_counts()plt.figure(figsize = (18,6)) plt.bar(data.index,data.values,color = 'r') plt.title('各地區酒店數量',fontsize = 20) plt.xlabel('地區',fontsize = 18) plt.ylabel('酒店數量',fontsize = 18) plt.tick_params(labelsize = 15) # 坐標軸上字體大小??
(4)畫出每個地區酒店數量的曲線圖
df = pd.read_excel(r'D:\數據分析\酒店數據2.xlsx') data = df.地區.value_counts()plt.figure(figsize = (18,6)) plt.plot(data.index,data.values) plt.title('各地區酒店數量',fontsize = 20) plt.xlabel('地區',fontsize = 18) plt.ylabel('酒店數量',fontsize = 18) plt.tick_params(labelsize = 15) # 坐標軸上字體大小??
(5)畫出各個價格等級占比的餅圖
data = df.價格等級.value_counts()plt.figure(figsize = (10,10)) patches,l_text,p_text = plt.pie(data.values,labels = data.index,autopct = '%.1f %%',startangle = 90) plt.title('價格等級占比',fontsize = 20)# 利用返回值,設置餅圖內部的字體 for i in p_text:i.set_size(15) # 內部字體大小i.set_color('w') # 內部字體顏色for i in l_text:i.set_size(18) # 外部字體大小i.set_color('k') # 外部字體顏色plt.legend() # 加上圖例??
(6)畫出酒店評分的直方圖
plt.figure(figsize = (10,6)) plt.hist(df['評分'],bins = 20,edgecolor = 'k',alpha = 0.6) plt.title('酒店評分直方圖',fontsize = 20) plt.xlabel('評分',fontsize = 18) # x軸名字 plt.ylabel('酒店數量',fontsize = 18) # y軸名字 plt.tick_params(labelsize = 14) # 坐標軸上字體大小??
(7)畫出每個類型酒店評分均值的曲線圖(按照評分均值從小到大排序),并標記出全部酒店評分均值所在的點
group = df['評分'].groupby(df['類型']).mean() # 以類型分組求評分均值 group = group.sort_values() # 均值數據升序排列 total = group.values.mean() # 全部酒店的評分均值plt.figure(figsize = (18,6)) plt.plot(group.index,group.values) plt.title('各類型酒店評分均值',fontsize = 20) plt.xlabel('類型',fontsize = 18) plt.ylabel('酒店評分均值',fontsize = 18) plt.tick_params(labelsize = 15) # 坐標軸上字體大小 plt.xticks(rotation = 90) # 把x軸字旋轉90度 plt.annotate('全部酒店評分均值',xy = (7.2,4.4),xytext = (3.9,4.5),arrowprops = {'facecolor':'yellow','edgecolor':'magenta'},fontsize = 15) # xy和 xytest的坐標純屬硬湊,只是為了滿足題目條件 # 因為 x軸坐標是離散的,且是文字,不知道如何精準定位坐標 # 以后想明白了再回來改總結
以上是生活随笔為你收集整理的Python 数据分析 —— Matplotlib ①的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(95):ps基本操作与图片格式
- 下一篇: 第六十七期:Python爬虫44万条数据