“Talk is cheap. Show me the code.”
― Linus Torvalds
老子第41章
上德若谷
大白若辱
大方無隅
大器晚成
大音希聲
大象無形
道隱無名
拳打千遍, 身法自然
110_1_高中週期性課程: Python程式入門與資料分析初探, 道明高中
以下基本圖表的類型, 參考 姜楓, 許桂秋, 大數據可視化技術, 人民郵電, 2019, 及 Kaggle 上的教學資料等.
直接將資料畫出, 看出一個初步的模式或走向, 是最基本的作法, 這類圖粗略分為:
下圖依序自左向右是
plt.bar()
plt.bar([0,1,2,3,5,等等], data)
底下我們設定4個長條的x座標是 [5,6,7,8]
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar([5,6,7,8], data)
#plt.bar(range(len(data)), data)
plt.show()
底下我們也可以設定4個長條的x座標是 [0,1,2,3], 或是用 range(len(data)), 一樣
data = [10., 20., 5., 15.]
range(len(data))
import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
#plt.bar([5,6,7,8], data)
plt.bar(range(len(data)), data)
plt.show()
plt.barh()
就是把柱狀圖轉成橫的
我們把剛剛上面的垂直條形图的程式碼中 plt.bar()
改成 plt.barh()
, 就可以轉成水平的, 同時把顏色改成 color='r'
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.barh()
import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.barh([5,6,7,8], data, color='r')
plt.show()
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## 多组条形图 plt.bar()
import numpy as np
import matplotlib.pyplot as plt
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]]
x = np.arange(4)
plt.bar(x + 0.00, data[0], color = 'b', width = 0.25)
plt.bar(x + 0.25, data[1], color = 'g', width = 0.25)
plt.bar(x + 0.50, data[2], color = 'r', width = 0.25)
plt.show()
plt.scatter(), plt.plot()
散點圖使用 plt.plot()
: 一如在 Python 與數據資料分析2 中我們講解 plt.plot(), 有說到, 預設是折線, 如果設定點的 marker 為 例如 ‘o’, 或是 ‘+’, 就會以散點的方式呈現.
官網的Notes: 如果是一樣大小顏色形狀之散點, 用 plot() 效能會較快!
plot() 對點的設定: 大小, 顏色, 形狀等, 是全部的點一起, 無法差異化.
散點圖使用 plt.scatter()
: 另一個不完全等價的指令就是 plt.scatter()
但是 scatter() 與 plot() 還是有差別,
scatter()可以對個別點設定不同的大小, 顏色, 形狀,
官網的Notes: The plot function will be faster for scatterplots where markers don’t vary in size or color. 如果是一樣大小顏色形狀之散點, 用 plot() 效能會較快!
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)[source]
Ref: pyplot.scatter(): API Overview/matplotlib.pyplot/matplotlib.pyplot.scatter, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter link
plt.plot()
, 設定點的 marker以下 codes, 是以 plt.plot(), 設定點的 marker 為例如 ‘.’, 顏色為 ‘blue’, 就會以散點的方式呈現.
plt.plot(data[:,0], data[:,1], 'b.'
)
data = np.random.rand(1000, 2)
是一個 1000乘2, 的隨機數構成之矩陣
data[:,0]
就是取出第一個直行, 當作 x 座標
data[:,1]
就是取出第二個直行, 當作 y 座標
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.scatter_盼小辉.py
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1000, 2)
plt.plot(data[:,0], data[:,1], 'b.')
#plt.scatter(data[:,0], data[:,1])
plt.show()
plt.scatter()
接個我們用 plt.scatter()
來得到一樣的效果, 我們把顏色改成 green, 要特別注意, pyplot()特有的類似Matlab 的語法, 例如 '.g'
代表 描點, 綠色, 在 scatter()不能用, 必須用 marker='.'
, color='g'
等等:
plt.scatter(data[:,0], data[:,1],marker='.',color='g')
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.scatter_盼小辉.py
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1000, 2)
#plt.scatter(data[:,0], data[:,1],'g.')
plt.scatter(data[:,0], data[:,1],marker='.',color='g')
plt.show()
plt.Scatter()
呈現散點之不同大小顏色_官網例子:每個點的顏色, 面積大小, 分別用隨機數來控制, 使得呈現出每個點之大小, 顏色 都不一樣
先用 np.random.rand(N)
產生N 個隨機數組
N = 50
colorList = np.random.rand(N)
area = (30 * np.random.rand(N)
)**2 # 0 to 15 point radii
再用
c=colorList
指定每個點的顏色, 依照colorList 這個 list, c (就是 color)
用
s=area
指定每個點的大小, 依照 area 這個 list, s (就是 size)
完整指令也就是:
plt.scatter(x, y, s=area, c=colors
, alpha=0.5)
np.random.rand(N)
是 numpy 中的產生 uniform random(均勻分布之隨機數) 的指令, 數值介於 0~1, 產生 N 個.
##https://matplotlib.org/stable/gallery/shapes_and_collections/
##scatter.html#sphx-glr-gallery-shapes-and-collections-scatter-py
##Scatter plot: 不同大小顏色— Matplotlib 3.4.2 documentation
import numpy as np
import matplotlib.pyplot as plt
# Fixing random state for reproducibility
np.random.seed(19680801)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2 # 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
例如上面官網 plt.Scatter()
例子.
其實就是數據軌跡圖或是折線圖呈現走勢, 特別是橫軸x軸代表時間時, 例如股市價位隨著時間的描點
下圖呈現 2020年3月, 疫情與沙特石油影響下的美股走勢
以下是美股道瓊指數歷史100年回顧
ref: 【美股歷史走勢】道瓊指數歷史100年回顧, https://www.stockfeel.com.tw/%E9%81%93%E7%93%8A%E6%8C%87%E6%95%B8%E7%99%BE%E5%B9%B4%E5%A4%A7%E5%9B%9E%E9%A1%A7/ link
plt.hist
(頻數圖或頻率圖) histogram,類似柱狀圖, 但是他是呈現的是出現的頻率或次數, 例如一個班級中, 身高為160 的同學個數, 身高為 165 的同學個數, 身高為 170 的同學個數, 等等, 畫出來是一個鐘形圖, 即正規分布的鐘形圖, 中間數據的出現頻率較高(例如身高 165 的同學個數最多),
鐘形圖其實就是一個頻數圖或頻率圖 histogram, (其實叫直方圖無法望文生義)
np.random.randn(500)
plt.hist(x)
即可.##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.hist()
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(500)
#預設是分割成 10 個頻段
plt.hist(x)
plt.show()
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.hist()
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(500)
#plt.hist(x)
plt.hist(x, bins = 20, color='r')
plt.show()
density=True
將y座標改成用百分比density=True
density=True
)##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.hist()
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(500)
#plt.hist(x, bins = 20, color='r')
# density=True y座標改成用百分比
plt.hist(x, bins = 20, color='r', density=True)
plt.show()
plt.pie()
可以呈現占比的直觀感覺, 但不精確餅圖可以呈現占比多少的直觀感覺, 在一個圓披薩中, 越大片的扇形, 就感覺占比越多,
可以用來呈現例如手機品牌的用戶占比等, 給一個粗略的印象,
但是許多文件指出, 餅圖並不是一個好的呈現, 只能是一個補助, 容易產生錯覺, 能不用就不用, 在不是很嚴謹的場合, 仍不失為一個提供快速直觀感覺的方式.
例如以下是2015網路的圖表,
Ref: i-Buzz網路口碑報告:智慧型手機百家爭鳴,領導品牌具絕對優勢 2015, https://www.i-buzz.com.tw/industry/article_page/?id=MTk= link
相較於餅圖, 以下 2021年的圖表, 是以柱狀圖呈現, 就給人可以較精確比較的感覺
Ref: 排行榜】台灣手機品牌最新排名 (2021 年 1 月銷售市占), https://www.eprice.com.tw/mobile/talk/102/5623113/1/ link
plt.pie()
import matplotlib.pyplot as plt
data = [10, 15, 30, 20]
plt.pie(data)
plt.show()
plt.boxplot()
(box plot) 呈現四分位數的分布箱形圖可以呈現 一組數據的 中位数、四分位数、最大值和最小值的分布狀況, 例如它們某兩個是不是間隔很遠, 有沒有離群值, 等等
以下先產生 500 個隨機數,
data = np.random.randn(500)
再用
plt.boxplot(data)
畫出 data 的 箱形圖.
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.boxplot_盼小辉.py
import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(500)
plt.boxplot(data)
plt.show()
要畫出並列箱形圖, 需要數據就是2D的 array,
以下先用 np.random.randn(500, 3) 產生 500乘3的2D數組
再用
plt.boxplot(data)
就會畫出3組 box plot.
要畫出並列箱形圖, 需要輸入數據是2D的 array,
以 columnwise 縱行為一組
以下先用 np.random.randn(500, 3) 產生 500乘3的2D數組
data = np.random.randn(500, 3)
再下
plt.boxplot(data)
##Python-Matplotlib可视化(1)——一文详解常见统计图的绘制_盼小辉
## plt.boxplot_並列_盼小辉.py
import numpy as np
import matplotlib.pyplot as plt
# 要畫出並列箱形圖, 需要輸入數據是2D的 array,
# 以 columnwise 縱行為一組
# 以下先用 np.random.randn(500, 3) 產生 500乘3的2D數組
data = np.random.randn(500, 3)
#再下
plt.boxplot(data)
plt.show()
用 Matplotlib畫:
需要安装 matplotlib_venn 模組module:
官方文档:
https://pypi.org/project/matplotlib-venn/ link
The simplest way to install the package is via easy_install or pip:
easy_install matplotlib-venn
或是
pip install matplotlib_venn
Dependencies依賴庫:
numpy,
scipy,
matplotlib.
目前 matplotlib_venn 只能畫最多3個集合的關係圖
而 pyvenn 可以繪製 2~6组数据
pyvenn具有’venn2’, ‘venn3’, ‘venn4’, ‘venn5’, 'venn6’五大主要函数
載入時需用:
#添加pyvenn路径
import sys
sys.path.append(r'path\pyvenn-master')
import venn
matplotlib_venn 使用指令請參考以下csdn文章:
Ref: [python] 基于matplotlib_venn实现维恩图的绘制, https://blog.csdn.net/LuohenYJ/article/details/103091081
link
以下 clay-atlas.com 這篇講得較詳細淺顯:
[Python] 使用 matplotlib-venn 繪製文氏圖,
link
pyvenn 可以繪製 2~6组数据, 使用指令請參考以下知乎文章:
Ref: pythonic生物人, Python可视化28|matplotlib绘制韦恩图(2-6组数据),
知乎, https://zhuanlan.zhihu.com/p/195541937 link
通常是地圖上每個點, 用顏色越深表示數據越大, 例如疫情確診的數量, 越紅的區域表示確診的人越多越密, 或是降雨量等等.
Ref: 热力图(HeatMap)实现, https://www.jianshu.com/p/3ced545224f1
財經方面也很常用熱力圖:
CPI 熱力圖, 楊世光, 20210714:
常用來表現多維的數據, 例如一個學生各個面向的表現, 德智體群等各方面的分數表現.
如果變數量多, 會造成視覺的混淆, 只適合變數量較少的狀況.
Radar chart 用 Matplotlib 畫 有點繁瑣, 主要是使用極座標繪圖的方法,
而 seaborn 似乎也沒有現成的指令.
Ref: 此部分讀者可以參考:
推薦, 很棒的系列: Python-Matplotlib可视化(1)一文详解常见统计图的绘制, https://blog.csdn.net/LOVEmy134611/article/details/117301771 link
姜楓, 許桂秋, 大數據可視化技術, Sec 2.5, 人民郵電, 2019.
薛薇, R 語言數據挖掘, 電子工業.
3.1 數據的直觀印象
3.2 如何獲得單變量特徵的直觀印象
3.3 如何獲得多變量聯合分布的直觀印象
3.4 如何獲得變量間相關性的直觀印象
pyplot.scatter(): API Overview/matplotlib.pyplot/matplotlib.pyplot.scatter, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter link
Kaggle 此處的教學就是使用 seaborn: Data Visualization 資料視覺化教學, https://www.kaggle.com/learn/data-visualization link
Matplotlib30官網手冊與範例, https://matplotlib.org/2.0.2/index.html link.
Matplotlib30官網/Tutorials, 教學區, 分入門中階高階等, https://matplotlib.org/stable/tutorials/index.html link
Matplotlib30官網/Tutorials, 教學區, Usage Guide 是一整體的初步介紹,
“This tutorial covers some basic usage patterns and best-practices to help you get started with Matplotlib.”, https://matplotlib.org/stable/tutorials/index.html link
Matplotlib 3.4.2 官網/Tutorials, 教學區, Pyplot tutorial, 專門介紹 Pyplot, https://matplotlib.org/2.0.2/users/pyplot_tutorial.html, link
各範例附原始碼, 3.4.2 版的, 在主頁: https://matplotlib.org/, 點選 Example, https://matplotlib.org/stable/gallery/index.html link
這裡有初階到高階的各種範例附原始碼, 初學者可以從圖形找自己要的例子, 觀摩原始碼.
各範例附原始碼, 舊版 2.0.2 版的, 在Matplotlib官網各種例子, https://matplotlib.org/2.0.2/gallery.html link
Matplotlib 速查表 cheatsheet: 在使用這些指定特殊 style 的指令時, 手邊最好隨時準備好一張速查表 cheatsheet,
Pjer, Matplotlib速查表——画图时候一定要放手边的表, link
Matplotlib 速查表 cheatsheet: 原始出處為 Matplotlib 的 github 處: https://link.zhihu.com/?target=https%3A//github.com/rougier/matplotlib-cheatsheet, link
顏色之 RGB 與 16進制 與英文名稱之對照總表
可以參考 Wiki,
或是 R-color 那張表: Bio381那門課的網頁/Cheat Sheets & Programming Resources/Color Chart
https://gotellilab.github.io/Bio381/CheatSheets/CheatSheets.html
https://gotellilab.github.io/Bio381/CheatSheets/ColorChart.pdf link
黃春林, Matplotlib 使用教程, color 英文名稱.
美股歷史走勢】道瓊指數歷史100年回顧, https://www.stockfeel.com.tw/%E9%81%93%E7%93%8A%E6%8C%87%E6%95%B8%E7%99%BE%E5%B9%B4%E5%A4%A7%E5%9B%9E%E9%A1%A7/ link
CSDN Markdown Mermaid 流程图示例, https://blog.csdn.net/qwfys200/article/details/84887665 link
雷達圖:
循序漸進的解說: assassin_sword, Python笔记—matplotlib雷达图, https://blog.csdn.net/weixin_41521681/article/details/90174509?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control link
落痕的寒假, [python] 基于matplotlib实现雷达图的绘制, https://blog.csdn.net/LuohenYJ/article/details/108348667 link
維恩圖 Venn diagram:
文氏圖, Wiki, https://zh.wikipedia.org/zh-tw/%E6%96%87%E6%B0%8F%E5%9B%BE link
https://pypi.org/project/matplotlib-venn/ link
python 基于matplotlib_venn实现维恩图的绘制, https://blog.csdn.net/LuohenYJ/article/details/103091081 link
以下 clay-atlas.com 這篇講得較詳細:
[Python] 使用 matplotlib-venn 繪製文氏圖,
https://clay-atlas.com/blog/2020/06/11/python-%E4%BD%BF%E7%94%A8-matplotlib-venn-%E7%B9%AA%E8%A3%BD%E6%96%87%E6%B0%8F%E5%9C%96/ link
pyvenn 使用指令請參考以下知乎文章:
Ref: pythonic生物人, Python可视化28|matplotlib绘制韦恩图(2-6组数据), 知乎, https://zhuanlan.zhihu.com/p/195541937 link