小白學 Python 資料分析(18):Matplotlib(三)常用圖表(上)
阿新 • • 發佈:2020-03-23
![](https://cdn.geekdigging.com/python/spider-blog/Python_logo.jpg)
> 人生苦短,我用 Python
前文傳送門:
[小白學 Python 資料分析(1):資料分析基礎](https://www.geekdigging.com/2020/01/19/6719980708/)
[小白學 Python 資料分析(2):Pandas (一)概述](https://www.geekdigging.com/2020/01/20/6718497214/)
[小白學 Python 資料分析(3):Pandas (二)資料結構 Series](https://www.geekdigging.com/2020/02/04/3234667780/)
[小白學 Python 資料分析(4):Pandas (三)資料結構 DataFrame](https://www.geekdigging.com/2020/02/05/9920298470/)
[小白學 Python 資料分析(5):Pandas (四)基礎操作(1)檢視資料](https://www.geekdigging.com/2020/02/16/6852411690/)
[小白學 Python 資料分析(6):Pandas (五)基礎操作(2)資料選擇](https://www.geekdigging.com/2020/02/20/6566891797/)
[小白學 Python 資料分析(7):Pandas (六)資料匯入](https://www.geekdigging.com/2020/02/23/7355903936/)
[小白學 Python 資料分析(8):Pandas (七)資料預處理](https://www.geekdigging.com/2020/02/25/9013297409/)
[小白學 Python 資料分析(9):Pandas (八)資料預處理(2)](https://www.geekdigging.com/2020/02/27/2857868620/)
[小白學 Python 資料分析(10):Pandas (九)資料運算](https://www.geekdigging.com/2020/02/29/5808964196/)
[小白學 Python 資料分析(11):Pandas (十)資料分組](https://www.geekdigging.com/2020/03/03/5975552137/)
[小白學 Python 資料分析(12):Pandas (十一)資料透視表(pivot_table)](https://www.geekdigging.com/2020/03/04/8327177610/)
[小白學 Python 資料分析(13):Pandas (十二)資料表拼接](https://www.geekdigging.com/2020/03/06/5036602239/)
[小白學 Python 資料分析(14):Pandas (十三)資料匯出](https://www.geekdigging.com/2020/03/07/6918490736/)
[小白學 Python 資料分析(15):資料視覺化概述](https://www.geekdigging.com/2020/03/09/7393240956/)
[小白學 Python 資料分析(16):Matplotlib(一)座標系](https://www.geekdigging.com/2020/03/14/2444388683/)
[小白學 Python 資料分析(17):Matplotlib(二)基礎操作](https://www.geekdigging.com/2020/03/16/2401104162/)
## 折線圖
各位同學好,我們從本篇開始介紹一些 Matplotlib 的常用圖表。
說道常用圖表,第一個肯定是折線圖,折線圖主要用於表現隨著時間的推移而產生的某種趨勢。
在 Matplotlib 中,化折線圖主要是使用到了 plt 庫中的 plot 方法,下面我們看下 plot 的語法。
plot 函式的一般的呼叫形式如下:
```python
#單條線:
plot([x], y, [fmt], *, data=None, **kwargs)
#多條線:
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
```
可選引數 `[fmt]` 是一個字串來定義圖的基本屬性如:顏色(color),點型(marker),線型(linestyle)。
具體形式 fmt = '[color][marker][line]'
這裡我們寫一個簡單的 fmt 的表示式,需要注意的是 fmt 接收的是每個屬性的單個字母縮寫,如果使用的是全名的話則不能使用 fmt 引數進行組合賦值。
```python
plot(x, y, 'bo-')
```
上面這個示例中的 `bo-` 的含義是藍色圓點實線,其中 `b` 代表了顏色 blue , `o` 代表了點型 circle marker (圓點), `-` 代表了線型 solid line style (實線) 。
如果我們使用全名的話上面這個示例可以改成:
```python
plot(x, y, color='blue', marker='o', linestyle='-')
```
下面小編摘抄一下官方文件上的對應的型別,官方文件地址:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html ,如果不想開啟官方文件,也可以在程式中執行下面這段程式碼,一樣可以看到:
```python
import matplotlib.pyplot as plt
help(plt.plot)
```
首先是顏色 color 的可取值:
```python
============= ===============================
character color
============= ===============================
``'b'`` blue
``'g'`` green
``'r'`` red
``'c'`` cyan
``'m'`` magenta
``'y'`` yellow
``'k'`` black
``'w'`` white
============= ===============================
```
這裡有一點需要注意,除了可以使用上面的這些值,同樣可以使用十六進位制的 RGB 字串,如: `#FFFFFF` 等。
接下來是點型 Maker 的可選值:
```python
============= ===============================
character description
============= ===============================
``'.'`` point marker
``','`` pixel marker
``'o'`` circle marker
``'v'`` triangle_down marker
``'^'`` triangle_up marker
``'<'`` triangle_left marker
``'>'`` triangle_right marker
``'1'`` tri_down marker
``'2'`` tri_up marker
``'3'`` tri_left marker
``'4'`` tri_right marker
``'s'`` square marker
``'p'`` pentagon marker
``'*'`` star marker
``'h'`` hexagon1 marker
``'H'`` hexagon2 marker
``'+'`` plus marker
``'x'`` x marker
``'D'`` diamond marker
``'d'`` thin_diamond marker
``'|'`` vline marker
``'_'`` hline marker
============= ===============================
```
大家看前面的符號應該大致都能知道是啥意思吧,小編這裡有點小懶(屬實有點多,小編自己的碎碎念:常用的就那麼幾種,一張圖上也不會出現太多種的線型,反正會有預設值),就不翻譯了,如果有看不懂的同學可以 CV 後面的英文到某些翻譯網站上自行翻譯。
接下來是線型 Line Styles 的可選值:
```python
============= ===============================
character description
============= ===============================
``'-'`` solid line style 實線
``'--'`` dashed line style 虛線
``'-.'`` dash-dot line style 點畫線
``':'`` dotted line style 點線
============= ===============================
```
這個就不解釋了吧,各位同學可以自行嘗試一下。
最後再來個示例吧,資料還是使用上一篇文章的:
```python
import matplotlib.pyplot as plt
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = [2011,2012,2013,2014,2015,2016,2017]
y_data = [58000,60200,63000,71000,84000,90500,107000]
y_data_1 = [78000,80200,93000,101000,64000,70500,87000]
plt.title(label='xxx 公司 xxx 產品銷量')
# 設定標題
plt.plot(x_data, y_data, linestyle = '-.', label = '產品銷量')
plt.plot(x_data, y_data_1, label = '使用者增長數')
# 開啟網格線
plt.grid(True)
# 設定圖例
plt.legend()
# 檔案儲存
plt.savefig("plot_demo.png")
```
結果如下:
![](https://cdn.geekdigging.com/data_analysis/data_visualization/plot_demo.png)
這個樣例中,我們將產品銷量使用點線圖來表示。
## 柱狀圖
### 普通柱狀圖
柱狀圖主要用於檢視各分組資料的數量分佈,以及各個分組資料之間的數量比較。
在 Matplotlib 中使用的是 `bar()` 方法,還是先看下 `bar()` 的語法:
```python
atplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)
```
| 引數 | 接收值 | 說明 | 預設值 |
| --------------------------- | ------ | ------------------------------- | ------ |
| left | array | x 軸; | 無 |
| height | array | 柱形圖的高度,也就是y軸的數值; | 無 |
| alpha | 數值 | 柱形圖的顏色透明度 ; | 1 |
| width | 數值 | 柱形圖的寬度; | 0.8 |
| color(facecolor) | string | 柱形圖填充的顏色; | 隨機色 |
| edgecolor | string | 圖形邊緣顏色 | None |
| label | string | 解釋每個影象代表的含義 | 無 |
| linewidth(linewidths / lw) | 數值 | 邊緣or線的寬度 | 1 |
其他詳細的用法可以參考官方文件:https://matplotlib.org/api/pyplot_api.html 。
我們還是先來一個簡單的示例,資料依然使用上面的資料:
```python
import matplotlib.pyplot as plt
import numpy as np
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = np.array([2011,2012,2013,2014,2015,2016,2017])
y_data = np.array([58000,60200,63000,71000,84000,90500,107000])
y_data_1 = np.array([78000,80200,93000,101000,64000,70500,87000])
plt.title(label='xxx 公司 xxx 產品銷量')
plt.bar(x_data, y_data, width=0.5, alpha=0.6, facecolor = 'deeppink', edgecolor = 'darkblue', lw=2, label='產品銷量')
plt.legend()
plt.savefig("bar_demo_1.png")
```
* width : 柱子的寬度
* alpha : 透明度
* facecolor : 柱子填充色
* edgecolor : 柱子輪廓色
* lw : 柱子輪廓寬度
* label : 圖例
結果如下:
![](https://cdn.geekdigging.com/data_analysis/data_visualization/bar_demo_1.png)
### 並排柱狀圖
我們還有一組資料,接下來是兩個柱形圖並列顯示,這裡呼叫的還是 `bar()` ,只不過需要調整的是柱子的位置:
```python
import matplotlib.pyplot as plt
import numpy as np
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = np.array([2011,2012,2013,2014,2015,2016,2017])
y_data = np.array([58000,60200,63000,71000,84000,90500,107000])
y_data_1 = np.array([78000,80200,93000,101000,64000,70500,87000])
plt.title(label='xxx 公司 xxx 產品銷量')
plt.bar(x_data, y_data, width=0.3, alpha=0.6, facecolor = 'pink', edgecolor = 'blue', lw=1, label='產品銷量')
plt.bar(x_data + 0.3, y_data_1, width=0.3, alpha=0.6, facecolor = 'blue', edgecolor = 'blue', lw=1, label='使用者增長數')
plt.legend()
plt.savefig("bar_demo_2.png")
```
這裡比較重要的是 `x_data + 0.3` ,相當於把使用者量的柱子向右移動了 0.3 ,否則會造成重合。
結果如下:
![](https://cdn.geekdigging.com/data_analysis/data_visualization/bar_demo_2.png)
### 堆積柱狀圖
還有一種柱形圖是堆積柱形圖,就是把柱狀圖堆疊在一起,我們還是通過示例來看:
```python
import matplotlib.pyplot as plt
import numpy as np
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = np.array([2011,2012,2013,2014,2015,2016,2017])
y_data = np.array([58000,60200,63000,71000,84000,90500,107000])
y_data_1 = np.array([78000,80200,93000,101000,64000,70500,87000])
plt.title(label='xxx 公司 xxx 產品銷量')
plt.bar(x_data, y_data, width=0.3, alpha=0.6, facecolor = 'pink', edgecolor = 'blue', lw=1, label='產品銷量')
plt.bar(x_data, y_data_1, bottom=y_data, width=0.3, alpha=0.6, facecolor = 'blue', edgecolor = 'blue', lw=1, label='使用者增長數')
plt.legend()
plt.savefig("bar_demo_3.png")
```
這種堆積柱狀圖主要是通過引數 bottom 來實現的,含義是底部開始的位置。
結果如下:
![](https://cdn.geekdigging.com/data_analysis/data_visualization/bar_demo_3.png)
### 橫向柱狀圖
其實橫向柱狀圖應該是叫條形圖,而且使用的方法也不再是 `bar()` 了,而是變成了 `barh()` 。
咦,這個看起來和 `bar()` 很像嘛,有可能是兄弟關係。
語法如下:
```python
matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
```
也不多說啥了,和上面的 `bar()` 簡直如出一轍,還是再來個示例:
```python
import matplotlib.pyplot as plt
import numpy as np
# 處理中文亂碼
plt.rcParams['font.sans-serif']=['SimHei']
x_data = np.array([2011,2012,2013,2014,2015,2016,2017])
y_data = np.array([58000,60200,63000,71000,84000,90500,107000])
plt.title(label='xxx 公司 xxx 產品銷量')
plt.barh(x_data, y_data, alpha=0.6, facecolor = 'deeppink', edgecolor = 'deeppink', label='產品銷量')
plt.legend()
plt.savefig("barh_demo.png")
```
結果如下:
![](https://cdn.geekdigging.com/data_analysis/data_visualization/barh_demo.png)
本篇內容就到這裡了,各位同學想要程式碼或者想要圖片都可以直接訪問程式碼倉庫獲得。
## 程式碼倉庫
老規矩,所有的示例程式碼都會上傳至程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。
[示例程式碼-Github](https://github.com/meteor1993/python-learning/tree/master/python-data-analysis/matplotlib "示例程式碼-Github")
[示例程式碼-Gitee](https://gitee.com/inwsy/python-learning/tree/master/python-data-analysis/matplotlib "示例程式碼-Gitee")
## 參考
https://blog.csdn.net/sinat_36219858/article/details/79800460
https://blog.csdn.net/weixin_40683253/article/details/