Python 與數據資料分析3.1-資料視覺化-基本圖表類型

“Talk is cheap. Show me the code.”
― Linus Torvalds

老子第41章
上德若谷
大白若辱
大方無隅
大器晚成
大音希聲
大象無形
道隱無名

拳打千遍, 身法自然

110_1_高中週期性課程: Python程式入門與資料分析初探, 道明高中

本系列文章之連結

  • Python程式與數據資料分析1 link
  • Python程式與數據資料分析1.1 Kaggle站免費教學的路徑圖 link
  • Python 與數據資料分析2-資料視覺化-Matplotlib.pyplot 入門 link
  • Python 與數據資料分析3.1-資料視覺化-基本圖表類型 link
  • Python 與數據資料分析3.2-資料視覺化-從 seabon 的函數分類來看 link
  • Python與資料分析3.3-資料視覺化-seaborn 補充 link
  • Python與資料分析4-資料視覺化-鳶尾花 link
  • Python與資料分析 5-入門級競賽分析-鐵達尼號 link

文章目录

  • 本系列文章之連結
  • 數據可視化的基本圖表
    • 原始數據繪圖
      • 垂直條形图 `plt.bar()`
        • 水平條形圖(Horizontal bar chart) `plt.barh()`
        • 多组条形图
      • 散點圖 `plt.scatter(), plt.plot()`
        • `plt.plot()`, 設定點的 marker
        • `plt.scatter()`
        • `plt.Scatter()` 呈現散點之不同大小顏色_官網例子:
      • 氣泡圖, 就是散點圖, 只是用不同大小的點, 點的大小表示某個數據的大小
      • 走勢圖(趨勢圖)
      • 直方圖 `plt.hist` (頻數圖或頻率圖) histogram,
      • 餅圖 `plt.pie()` 可以呈現占比的直觀感覺, 但不精確
      • 箱形圖 `plt.boxplot()` (box plot) 呈現四分位數的分布
        • 多個箱形圖並列
      • 等高線圖(等值線) contour
      • 文氏圖或叫維恩圖 Venn diagram,
      • 熱力圖 heatmap
      • 雷達圖 Radar chart
    • 簡單統計值描繪
    • 多視圖協調關聯
  • 以任務為分類的各種圖表呈現
    • 時間數據可視化
    • 比例數據可視化
    • 關係數據可視化
    • 文本數據可視化
    • 複雜數據可視化
    • 交互式數據可視化
  • 數據的直觀印象
    • 如何獲得單變量特徵的直觀印象
    • 如何獲得多變量聯合分布的直觀印象
    • 如何獲得變量間相關性的直觀印象
  • Reference


數據可視化的基本圖表

以下基本圖表的類型, 參考 姜楓, 許桂秋, 大數據可視化技術, 人民郵電, 2019, 及 Kaggle 上的教學資料等.

原始數據繪圖

直接將資料畫出, 看出一個初步的模式或走向, 是最基本的作法, 這類圖粗略分為:

下圖依序自左向右是

  • 柱狀圖 bar plot
  • 散點圖 scatter plot,
  • 折線圖 line plot
    3個 group群體的某項資料, 例如三個國家的面積大小, 三個國家的人口數等, 都可以呈現最簡單的一個分布或是比較
    Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第1张图片

垂直條形图 plt.bar()

plt.bar([0,1,2,3,5,等等], data)
底下我們設定4個長條的x座標是 [5,6,7,8]

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第2张图片

##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))

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第3张图片

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()

水平條形圖(Horizontal bar chart) plt.barh()

就是把柱狀圖轉成橫的
我們把剛剛上面的垂直條形图的程式碼中 plt.bar() 改成 plt.barh(), 就可以轉成水平的, 同時把顏色改成 color='r'
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第4张图片

##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 與數據資料分析3.1-資料視覺化-基本圖表類型_第5张图片

##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

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第6张图片

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 與數據資料分析3.1-資料視覺化-基本圖表類型_第7张图片

##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 個.

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第8张图片

##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月, 疫情與沙特石油影響下的美股走勢

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第9张图片
以下是美股道瓊指數歷史100年回顧
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第10张图片
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, (其實叫直方圖無法望文生義)

  • 預設是分割成 10 個頻段
    產生 500 個正規分布之隨機數
    x = np.random.randn(500)
    再直接下 plt.hist(x) 即可.
    預設是分割成10個頻段
    可以看出, 平均值 0 附近的數, 出現的次數最高, 約100出頭.
    Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第11张图片
##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()

  • bins = 20 指定分割成頻段為20個
    也可以指定分割成頻段為20個, 顏色改成 red 紅色
    plt.hist(x, bins = 20, color='r')
    Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第12张图片
##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
    將y座標改成用百分比
    plt.hist(x, bins = 20, color=‘r’, density=True)

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第13张图片

##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
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第14张图片
相較於餅圖, 以下 2021年的圖表, 是以柱狀圖呈現, 就給人可以較精確比較的感覺
Ref: 排行榜】台灣手機品牌最新排名 (2021 年 1 月銷售市占), https://www.eprice.com.tw/mobile/talk/102/5623113/1/ link
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第15张图片

  • 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 與數據資料分析3.1-資料視覺化-基本圖表類型_第16张图片

##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 與數據資料分析3.1-資料視覺化-基本圖表類型_第17张图片

##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()

等高線圖(等值線) contour

文氏圖或叫維恩圖 Venn diagram,

就是中小學的交集聯集的圖
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第18张图片
Ref: Wiki.

用 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

熱力圖 heatmap

通常是地圖上每個點, 用顏色越深表示數據越大, 例如疫情確診的數量, 越紅的區域表示確診的人越多越密, 或是降雨量等等.
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第19张图片
Ref: 热力图(HeatMap)实现, https://www.jianshu.com/p/3ced545224f1

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第20张图片
財經方面也很常用熱力圖:
CPI 熱力圖, 楊世光, 20210714:
Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第21张图片

雷達圖 Radar chart

常用來表現多維的數據, 例如一個學生各個面向的表現, 德智體群等各方面的分數表現.
如果變數量多, 會造成視覺的混淆, 只適合變數量較少的狀況.
Radar chart 用 Matplotlib 畫 有點繁瑣, 主要是使用極座標繪圖的方法,
而 seaborn 似乎也沒有現成的指令.

Python 與數據資料分析3.1-資料視覺化-基本圖表類型_第22张图片

Ref: 此部分讀者可以參考:

  • 循序漸進的解說: assassin_sword, Python笔记—matplotlib雷达图, csdn link
  • 落痕的寒假, [python] 基于matplotlib实现雷达图的绘制, link

簡單統計值描繪

多視圖協調關聯

以任務為分類的各種圖表呈現

時間數據可視化

比例數據可視化

關係數據可視化

文本數據可視化

複雜數據可視化

交互式數據可視化

數據的直觀印象

如何獲得單變量特徵的直觀印象

如何獲得多變量聯合分布的直觀印象

如何獲得變量間相關性的直觀印象

Reference

  • 推薦, 很棒的系列: Python-Matplotlib可视化(1)一文详解常见统计图的绘制, https://blog.csdn.net/LOVEmy134611/article/details/117301771 link

  • 姜楓, 許桂秋, 大數據可視化技術, Sec 2.5, 人民郵電, 2019.

    • Sec 2.5 數據可視化的基本圖表
      2.5.1 原始數據繪圖
      2.5.2 簡單統計值描繪
      2.5.3 多視圖協調關聯
      ch 3 時間數據可視化
      ch 4 比例數據可視化
      ch 5 關係數據可視化
      ch 6 文本數據可視化
      ch 7 複雜數據可視化
      ch 8 交互式數據可視化
  • 薛薇, 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

你可能感兴趣的:(上課講義,笔记,python,算法,matplotlib,numpy)