28個資料視覺化圖表的總結和介紹

deephub發表於2023-01-08

資料視覺化本身就是一種通用語言。我們這裡通用語言的意思是:它能夠向各行各業的人表示資訊。它打破了語言和技術理解的障礙。資料是一些數字和文字的組合,但是視覺化可以展示資料包含的資訊。

“資料視覺化有助於彌合數字和文字之間的差距”——Brie E. Anderson。

有許多無程式碼/少程式碼的資料視覺化工具,如tableau、Power BI、Microsoft Excel等。但是作為一名資料科學從業者最好的工具還是python。所以在我們進行資料科學專案的時候,一定要注意資料視覺化,因為這是表示資訊和洞察資料的最簡單方法。

所以在這篇文章中,我們將整理我們能看到的所有資料視覺化圖表。如果你是資料科學初學者,那麼本文將是最適合你的。

資料視覺化是一種以圖形方式表示資料和資訊的方法。它可以被描述為使用圖表、動畫、資訊圖等將資料轉換為能夠視覺化的上下文。它有助於發現資料的趨勢和模式。

如果給你一個包含數百行的表格格式的資料集,你將感到困惑。但是適當的資料視覺化可以幫助你獲得資料的正確趨勢、異常值和模式等等。

初級資料視覺化

這裡我們總結了9個數基礎視覺化圖,這些都是我們在日常工作中常用的也是最簡單的圖表。

頻率表

頻率是一個值出現的次數的計數。頻率表是用表格表示頻率的一種方式。表格如下所示。

Scatter Plot

散點圖是一種在二維座標系中繪製兩個數值變數的方法。透過散點圖我們可以很容易地視覺化資料分佈

Line Plot

折線圖類似於散點圖,但點是用連續的線按順序連線起來的。在二維空間中尋找資料流時,折線圖更加直觀。

上圖可以看到weight 是如何續變化的。

Bar Chart
柱狀圖主要用於用柱狀表示類別變數的出現頻率。柱的不同高度表示頻率大小。

Histogram

方圖的概念與條形圖相同。 在柱狀圖中頻率顯示在分類變數的離散條中,而直方圖顯示連續間隔的頻率。 它可以用於查詢區間內連續變數的頻率 。

Pie Chart

餅圖以圓形的方式以百分比表示頻率。每個元素根據其頻率百分比持有圓的面積。

Exploded Pie Chart

展開餅圖

展開餅圖和餅圖是一樣的。在展開餅圖中,可以展開餅圖的一部分以突出顯示元素。

Distribution Plot

分佈圖可以顯示連續變數的分佈。

Box Plot

箱線圖是一種基於五數彙總(“最小值”、第一四分位數 [Q1]、中位數、第三四分位數 [Q3] 和“最大值”)顯示資料分佈的標準化方法。 它可以顯示異常值等資訊。

中級資料視覺化

中級的視覺化圖表是對基礎視覺化圖表的延申,我們這裡總結了8個

Stacked Bar Chart

堆疊柱狀圖是一種特殊的柱狀圖。我們可以在堆疊柱狀圖中整合比傳統柱狀圖[2]更多的資訊。

Grouped Bar Chart

“分組柱狀圖”這個名字意味著——它是一種分成不同組的特殊型別的柱狀圖。它主要用於比較兩個分類變數。

Stacked Area Chart

堆疊面積圖將幾個區域序列疊加在一起進行繪製。每個序列的高度由每個資料點中的值決定。

Pareto Diagram

帕累託圖包括柱狀圖和折線圖,其中各個值由柱狀圖降序表示,直線表示累計總數。

Donut Chart

環形圖是一個以圓心為切口簡單的餅狀圖。雖然它和餅圖表達的意思是一樣的,但它也有一些優點:在餅圖中我們經常會混淆每個類別所共享的區域。由於餅圖的中心從環形圖中移除,所以它可以強調讀者要關注餅圖的外弧線,同時內圈也可以用來顯示額外的資訊。

Heatmap

熱圖是一個可以分為多個子矩形的矩形圖,它用不同顏色表示不同的值/強度。

Radar Chart

雷達圖是一種以二維圖表的形式顯示多後設資料的圖形方法,三個或更多變數在從同一點開始的軸上進行表示。 來自中心的輻條稱為半徑,代表變數的數值。 半徑之間的角度不包含任何資訊。

Treemap

矩形樹圖用巢狀的矩形形式顯示層次資料。

高階資料視覺化

這些圖都比較複雜,一般情況下可能也不太常見,但是在處理特定任務時卻非常好用。這裡總結了10個相關的圖表

Parallel Coordinate Plot

因為我們生活在三維空間,所以一般的視覺化最多處理3維的資料。但有時需要視覺化超過 3 維的資料,我們經常使用 PCA 或 t-SNE 來降維並繪製它。 在降維的情況下,可能會丟失大量的資訊。 並且有時我們需要考慮所有特徵,這時就需要平行座標圖。

Hexagonal Binning

六邊形分箱圖是用六邊形直觀表示二維數值資料點密度方法。

Contour Plot

2D等高線密度圖是視覺化特定區域內資料點密度的另一種方法。它可以方便的找到兩個數值變數的密度。例如下面的圖表顯示了每個陰影區域中有多少個資料點。

QQ-Plot

QQ代表分位數-分位數圖。這是一種直觀地檢查數值變數是否符合正態分佈的方法。

Violin Plot

小提琴圖和箱形圖是相關的。從小提琴圖中可以得到的另一個資訊是密度分佈。簡單地說它是一個與密度分佈整合的箱形圖。

Boxen Plot

Boxen Plot是seaborn庫引入的一種新型箱形圖。對於箱線圖的方框是在四分位上建立的。但在Boxen plot中,資料被劃分為更多的分位數。它可以提供了關於資料的更多見解。

Point Plot

點座標圖包含了一些名為誤差線的線的折線圖。

透過上圖所示的點的位置來表示數值變數的集中趨勢,誤差線表示變數的不確定性(置信區間)。繪製折線圖是為了比較數值變數在不同類別值下的變異性。

Swarm plot

分簇散點圖是另一個受“beeswarm”啟發的有趣圖表,我們可以瞭解不同的分類值如何沿數值軸分佈 。

Word Cloud

在單雲圖中,所有的單詞都被繪製在一個特定的區域,頻繁出現的單詞被高亮顯示(用較大的字型顯示。

Sunburst Chart

旭日圖是環行圖或餅圖的定製版本,它將一些額外的層次資訊整合到圖中。

地理空間資料視覺化

地理空間資料視覺化側重於資料與其物理位置之間的關係,地理空間視覺化的獨特之處在於其規模都不較大。

地理視覺化將變數疊加在地圖上,使用緯度和經度來顯示資訊。

地圖是地理空間視覺化的主要焦點。它們的範圍從描繪街道、城鎮、公園或分割槽到顯示一個國家、大陸或整個星球的邊界。它們充當額外資料的容器。它們可以幫助識別問題、跟蹤變化、理解趨勢,並執行與特定地點和時間相關的預測。所以這裡單獨將其提出說明

一些用於地理空間資料視覺化的python庫和工具

tableau, power b.i., ArcGIS, QGIS等都可以用於複雜的地理空間資料視覺化。python中也有很多也非常適合地理空間資料視覺化的庫,例如

  • Geoplot
  • Folium
  • Geopandas
  • PySAL
  • rworldmap
  • rworldxtra
  • etc.

我將使用Folium來展示視覺化的一些實現。

這裡使用了HIFLD的醫院資料集,其中包含醫院位置和其他醫院資訊。根據授權資訊這個資料是可以被公開展示的

主資料集中有34個特徵。出於演示目的,我將使用“ADDRESS”、“STATE”、“TYPE”、“STATUS”、“POPULATION”、“LATITUDE”、“LONGITUDE”這些特徵。其中“LATITUDE”和“LONGITUDE”將用於確定醫院在地圖上的位置,而其他列如STATE、TYPE和STATUS用於過濾,最後ADDRESS和POPULATION用作自定義地圖上的標記的後設資料。

繪製基本地圖

匯入繪製地圖所需的庫。

import pandas as pd
import folium
from folium.plugins import MarkerCluster

載入資料集。

hosp_df = pd.read_csv('/work/Hospitals.csv')

過濾資料。

WORKING_COLS = ["ADDRESS", "STATE", "TYPE", "STATUS", "POPULATION", "LATITUDE", "LONGITUDE"]
STATE = "CA"
hosp_df = hosp_df.loc[hosp_df["STATE"] == STATE, WORKING_COLS]
hosp_df.head(5)

一些資料預處理。

hosp_df = hosp_df[hosp_df["POPULATION"] >= 0]
hosp_df.describe()

繪製地圖

Folium提供了.Map() ,它將位置引數作為包含一對緯度和經度的列表,並圍繞給定位置生成一個地圖,自動將生成的地圖會圍繞資料居中。

m=folium.Map(
    location=[hosp_df["LATITUDE"].mean(), hosp_df["LONGITUDE"].mean()],
    zoom_start=6)
m

圖中三角的點就是我們資料集中包含的資料點

新增圖層

Folium 中的預設地圖是 OpenStreetMap。 我們可以新增具有不同圖層,例如 Stamen Terrain、Stamen Water Color、CartoDB Positron 等,得到不同的圖層表示

使用 folium.TileLayer 將多個圖層新增單個地圖中,並使用folium.LayerControl以互動方式進行切換。

m=folium.Map(
    location=[hosp_df["LATITUDE"].mean(), hosp_df["LONGITUDE"].mean()],
    zoom_start=6)
folium.TileLayer('cartodbdark_matter').add_to(m)
folium.TileLayer('cartodbpositron').add_to(m)
folium.TileLayer('Stamen Terrain').add_to(m)
folium.TileLayer('Stamen Toner').add_to(m)
folium.TileLayer('Stamen Water Color').add_to(m)
folium.LayerControl().add_to(m)
m

可以看到右上角出現了圖層選擇的按鈕

生成地圖示記

在互動式地圖中,標記對於指定位置非常重要。folium.Marker可以在給定位置建立一個標記

m=folium.Map(
    location=[hosp_df["LATITUDE"].mean(), hosp_df["LONGITUDE"].mean()],
    zoom_start=8)

hosp_df.apply(
    lambda row: folium.Marker(
        location=[row['LATITUDE'], row['LONGITUDE']]
        ).add_to(m),
    axis=1)
m

自定義標記

也可以使用自定義標記

m=folium.Map(
    location=[hosp_df['LATITUDE'].mean(), hosp_df['LONGITUDE'].mean()],
    zoom_start=8)

def get_icon(status):
  if status == "OPEN":
    return folium.Icon(icon='heart',
                       color='black',
                       icon_color='#2ecc71'
                       )
  else:
    return folium.Icon(icon='glyphicon-off',
                       color='red')

hosp_df.apply(
    lambda row: folium.Marker(
        location=[row['LATITUDE'], row['LONGITUDE']],
        #color='red',
        popup=row['ADDRESS'],
        tooltip='<h5>Click here for more info</h5>',
        icon=get_icon(row['STATUS']),
        ).add_to(m),
    axis=1)
m

生成氣泡圖

為了表示地圖上的數值,我們可以透過將圓半徑與其在資料集中的值繫結來繪製不同大小的圓。在我們的例子中,我們用每個中心表示覆蓋的人口,其半徑與其population值成正比。

m=folium.Map(
    location=[hosp_df['LATITUDE'].mean(), hosp_df['LONGITUDE'].mean()],
    zoom_start=8)

def get_radius(pop):
  return int(pop / 20)

hosp_df.apply(
    lambda row: folium.CircleMarker(
        location=[row['LATITUDE'], row['LONGITUDE']],
        radius=get_radius(row['POPULATION']),
        popup=row['ADDRESS'],
        tooltip='<h5>Click here for more info</h5>',
        stroke=True,
        weight=1,
        color="#3186cc",
        fill=True,
        fill_color="#3186cc",
        opacity=0.9,
        fill_opacity=0.25,
        ).add_to(m),
    axis=1)
m

生成標記簇

在資料點密集地圖上工作時,使用標記簇可以以避免許多附近標記相互重疊造成的混亂的情況。 Folium 提供了一種設定標記簇的簡單方法,將它們新增到 folium.plugins.MarkerCluster 例項

m=folium.Map(
    location=[hosp_df['LATITUDE'].mean(), hosp_df['LONGITUDE'].mean()],
    zoom_start=8)

cluster = MarkerCluster(name="Hospitals")

def get_icon(status):
  if status == "OPEN":
    return folium.Icon(icon='heart',
                       color='black',
                       icon_color='#2ecc71'
                       )
  else:
    return folium.Icon(icon='glyphicon-off',
                       color='red')

hosp_df.apply(
    lambda row: folium.Marker(
        location=[row['LATITUDE'], row['LONGITUDE']],
        popup=row['ADDRESS'],
        tooltip='<h5>Click here for more info</h5>',
        icon=get_icon(row['STATUS']),
        ).add_to(cluster),
    axis=1)
cluster.add_to(m)
m

當滑鼠懸停在一個標記上時,它會顯示該簇所覆蓋區域的邊界。這種預設行為可以透過將showCoverageOnHover選項設定為false來取消,如下所示

cluster = MarkerCluster(name="Hospitals", options={"showCoverageOnHover": False})

總結

這篇文章有點長,但我完全相信它會對你有很大的幫助。我在本文中整理了基本上所有的圖表概述。這將是一篇關於資料視覺化的完整文章,尤其是展示了地理位置視覺化的一些方法,希望這篇文章對你有所幫助。

https://avoid.overfit.cn/post/93e1e9cadcb84b13bf6a44b981a41843

作者 Md. Zubair

相關文章