Skip to content

Latest commit

 

History

History
320 lines (243 loc) · 13.1 KB

76.数据可视化-2.md

File metadata and controls

320 lines (243 loc) · 13.1 KB

資料視覺化-2

透過前面的學習,我們已經對資料視覺化工具 matplotlib 有一個初步的認知。大家可能也會發現了,matplotlib 提供的函式雖然強大,但是引數太多,要想對圖表進行深度的定製就需要修改一系列的引數,這一點對新手並不友好。另一方面,使用 matplotlib 定製的統計圖是靜態圖表,可能在某些需要互動效果的場景下並不合適。為了解決這兩個問題,我們為大家介紹兩個新的視覺化工具,一個是 seaborn,一個是 pyecharts。

Seaborn

Seaborn 是建立在 matplotlib 之上的資料視覺化工具,它相當於是對 matplotlib 進行了更高階的封裝,而且 seaborn 也能跟 pandas 無縫整合,讓我們可以用更少的程式碼構建出更好的統計圖表,幫助我們探索和理解資料。Seaborn 包含但不侷限於以下描述的功能:

  1. 面向資料集的 API,可用於檢查多個變數之間的關係。
  2. 支援使用分類變數來顯示觀察結果或彙總統計資料。
  3. 能夠視覺化單變數或雙變數分佈以及在資料子集之間進行比較的選項
  4. 各類因變數線性迴歸模型的自動估計與作圖。
  5. 整合調色盤和主題,輕鬆定製統計圖表的視覺效果。

可以使用 Python 的包管理工具 pip 來安裝 seaborn。

pip install seaborn

在 Jupyter 中,可以直接使用魔法指令進行安裝,如下所示。

%pip install seaborn

下面,我們用 seaborn 自帶的資料集為例,為大家簡單的展示 seaborn 的用法和強大之處,想要深入研究 seaborn 的讀者可以自行閱讀官方文件和並檢視官方作品集中的示例。根據官方示例來編寫自己的程式碼是一個不錯的選擇,簡單的說就是保留官方程式碼,將資料換成自己的資料即可。下圖展示了 seaborn 繪製圖表的函式,可以看出,seaborn 的這些函式主要支援我們透過繪製圖表來探索資料的關係、分佈和分類。

使用 seaborn,首先需要匯入該庫並設定主題,程式碼如下所示。

import seaborn as sns

sns.set_theme()

如果需要在圖表上顯示中文,還需要用之前講過的方法修改 matplotlib 的配置引數,程式碼如下所示。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei', ]
plt.rcParams['axes.unicode_minus'] = False

注意:上面的程式碼必須放在呼叫 set_theme 函式之後,否則呼叫 set_theme 函式時又會重新修改 matplotlib 配置引數中的字型設定。

載入官方的 Tips 資料集(就餐小費資料)。

tips_df = sns.load_dataset('tips')
tips_df.info()

執行結果如下所示,其中 total_bill 表示賬單總金額,tip 表示小費的金額,sex 是顧客的性別,smoker 表示顧客是否抽樣,day 代表星期幾,time 代表是午餐還是晚餐,size 是就餐人數。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
 #   Column      Non-Null Count  Dtype   
---  ------      --------------  -----   
 0   total_bill  244 non-null    float64 
 1   tip         244 non-null    float64 
 2   sex         244 non-null    category
 3   smoker      244 non-null    category
 4   day         244 non-null    category
 5   time        244 non-null    category
 6   size        244 non-null    int64   
dtypes: category(4), float64(2), int64(1)
memory usage: 7.4 KB

由於資料集是聯網載入的,上述程式碼可能因為 SSL 的原因無法獲取到資料,可以嘗試先執行下面的程式碼,然後再載入資料集。

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

如果我們希望瞭解賬單金額的分佈,可以使用下面的程式碼來繪製分佈圖。

sns.histplot(data=tips_df, x='total_bill', kde=True)

如果想了解變數之間的兩兩關係,我們可以繪製點對圖,程式碼和效果如下所示。

sns.pairplot(data=tips_df, hue='sex')

如果對上面圖表的顏色不滿意,還可以透過 palette 引數選擇 seaborn 自帶的“調色盤”來修改顏色,這種方式相比於自行指定顏色或使用隨機顏色方便和靠譜了很多,下圖為大家展示了部分 seaborn 自帶的“調色盤”。

我們可以將上面的程式碼稍作修改,看看執行結果有什麼差別。

sns.pairplot(data=tips_df, hue='sex', palette='Dark2')

接下來,我們為 total_bill 和 tip 兩組資料繪製聯合分佈圖,程式碼如下所示。

sns.jointplot(data=tips_df, x='total_bill', y='tip', hue='sex')

上面清晰的展示了,total_bill 和 tip 之間存在正相關關係,這一點我們也可以透過 DataFrame 物件的 corr 方法進行驗證。接下來,我們可以建立迴歸模型來擬合這些資料點,而 seaborn 的線性迴歸模型圖已經幫我們實現了這項功能,程式碼如下所示。

sns.lmplot(data=tips_df, x='total_bill', y='tip', hue='sex')

如果我們希望瞭解賬單金額的集中和離散趨勢,可以繪製箱線圖或小提琴圖,程式碼如下所示,我們將資料按星期四、星期五、星期六和星期天分別進行展示。

sns.boxplot(data=tips_df, x='day', y='total_bill')

sns.violinplot(data=tips_df, x='day', y='total_bill')

說明:相較於箱線圖,小提琴圖沒有標註異常點而是顯示了資料的整個範圍,另一方面,小提琴圖很好的展示了資料的分佈(密度軌跡)。

Pyecharts

Echarts 原來是百度開發的一個前端圖表庫,2018年1月16日,ECharts 進入 Apache Incubator 進行孵化,目前已經是 Apache 軟體基金會的頂級專案。憑藉著良好的互動性和精巧的圖表設計,ECharts 得到了眾多開發者的認可,而 pyecharts 就是基於 Python 語言對 ECharts 進行了包裝,讓 Python 開發者也可以使用 ECharts 繪製外觀精美且互動性強的統計圖表。

可以使用 Python 的包管理工具 pip 來安裝 pyecharts。

pip install pyecharts

在 Jupyter 中,可以直接使用魔法指令進行安裝,如下所示。

%pip install pyecharts

接下來,我們透過來自於 pyecharts 官方網站新手教程中的一個例子,來認識 pyecharts。當然,我們對官網的例子進行一些調整,程式碼如下所示。

from pyecharts.charts import Bar
from pyecharts import options
from pyecharts.globals import ThemeType

# 建立柱狀圖物件並設定初始引數(寬度、高度、主題)
bar = Bar(init_opts=options.InitOpts(
    width='600px',
    height='450px',
    theme=ThemeType.CHALK
))
# 設定橫軸資料
bar.add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
# 設定縱軸資料(第一組)
bar.add_yaxis(
    "商家A",
    [25, 20, 36, 10, 75, 90],
)
# 設定縱軸資料(第二組)
bar.add_yaxis(
    "商家B",
    [15, 12, 30, 20, 45, 60]
)
# 設定縱軸資料(第三組)
bar.add_yaxis(
    "商家C",
    [12, 32, 40, 52, 35, 26]
)
# 新增全域性配置引數
bar.set_global_opts(
    # 橫軸相關的引數
    xaxis_opts=options.AxisOpts(
        axislabel_opts=options.LabelOpts(
            color='white'
        )
    ),
    # 縱軸相關的引數(標籤、最小值、最大值、間隔)
    yaxis_opts=options.AxisOpts(
        axislabel_opts=options.LabelOpts(
            color='white'
        ),
        min_=0,
        max_=100,
        interval=10
    ),
    # 標題相關的引數(內容、連結、位置、文字樣式)
    title_opts=options.TitleOpts(
        title='2021年銷售資料展示',
        title_link='http://www.qfedu.com',
        pos_left='2%',
        title_textstyle_opts=options.TextStyleOpts(
            color='white',
            font_size=16,
            font_family='SimHei',
            font_weight='bold'
        )
    ),
    # 工具箱相關的引數
    toolbox_opts=options.ToolboxOpts(
        orient='vertical',
        pos_left='right'
    )
)
# 在Jupyter Notebook中渲染圖表
bar.render_notebook()

上面程式碼的執行效果如下圖所示。值得一提的是,下圖中的標題、圖例、右側的工具箱都是可以點選的,大家可以點選它們看看會有什麼樣的效果,ECharts 的魅力就在於它的互動效果,大家一定要試一試。如果要將下面的統計圖表儲存成一個網頁,可以將上面最後一行程式碼修改為bar.render('index.html')即可。

接下來,我們也是透過一個官方示例,看看如何繪製餅圖。

import pyecharts.options as opts
from pyecharts.charts import Pie

# 準備餅圖需要的資料
x_data = ["直接訪問", "郵件營銷", "聯盟廣告", "影片廣告", "搜尋引擎"]
y_data = [335, 310, 234, 135, 1548]
data = [(x, y) for x, y in zip(x_data, y_data)]

# 建立餅圖物件並設定初始化引數
pie = Pie(init_opts=opts.InitOpts(width="800px", height="400px"))
# 向餅圖新增資料
pie.add(
    '', 
    data_pair=data,
    radius=["50%", "75%"],
    label_opts=opts.LabelOpts(is_show=False),
)
# 設定全域性配置項
pie.set_global_opts(
    # 配置圖例相關的引數
    legend_opts=opts.LegendOpts(
        pos_left="legft",
        orient="vertical"
    )
)
# 設定資料系列配置引數
pie.set_series_opts(
    # 設定不顯示工具提示
    tooltip_opts=opts.TooltipOpts(is_show=False),
    # 設定餅圖標籤的樣式
    label_opts=opts.LabelOpts(formatter="{b}({c}): {d}%")
)
pie.render_notebook()

執行上面的程式碼,效果如下圖所示。

需要提醒大家注意的是,pyecharts 並不能直接使用 NumPy 的 ndarray 和 Pandas 的 Series、DataFrame 為其提供資料,它需要的是 Python 原生的資料型別。可能大家也注意到了,上面的程式碼中,我們使用的都是列表、元組這樣的資料型別。

最後,我們來看看如何繪製地圖,繪製地圖首先需要安裝額外的依賴庫來獲取地圖相關資訊,命令如下所示。

pip install echarts-countries-pypkg echarts-china-provinces-pypkg echarts-china-cities-pypkg echarts-china-counties-pypkg

在 Jupyter 中,可以直接使用魔法指令進行安裝,如下所示。

%pip install echarts-countries-pypkg
%pip install echarts-china-provinces-pypkg
%pip install echarts-china-cities-pypkg
%pip install echarts-china-counties-pypkg

說明:上面的四個庫分別包含了世界各國、中國省級行政區域、中國市級行政區域、中國區/縣級行政區域的資料。

然後,我們將全國各省抖音大V的資料放在一個列表中,程式碼如下所示。

data = [
    ('廣東', 594), ('浙江', 438), ('四川', 316), ('北京', 269), ('山東', 248),
    ('江蘇', 234), ('湖南', 196), ('福建', 166), ('河南', 153), ('遼寧', 152),
    ('上海', 138), ('河北', 86), ('安徽', 79), ('湖北', 75), ('黑龍江', 70), 
    ('陝西', 63), ('吉林', 59), ('江西', 56), ('重慶', 46), ('貴州', 39),
    ('山西', 37), ('雲南', 33), ('廣西', 24), ('天津', 22), ('新疆', 21),
    ('海南', 18), ('內蒙古', 14), ('臺灣', 11), ('甘肅', 7), ('廣西壯族自治區', 4),
    ('香港', 4), ('青海', 3), ('新疆維吾爾自治區', 3), ('內蒙古自治區', 3), ('寧夏', 1)
]

接下來,我們使用 pyecharts 在地圖上標記各省抖音大V人數。

from pyecharts.charts import Map

map_chart = Map()
map_chart.add('', data, 'china', is_roam=False)
map_chart.render_notebook()

程式碼的執行效果如下圖所示,將滑鼠置於地圖上時,會高亮對應的省並看到相關的資訊。

和 seaborn 一樣,我們建議大家參考官方提供的示例來使用 pyecharts,我們可以在 pyecharts 官方網站的左側導航欄中找到“圖表型別”選項,下面每種型別的圖表都有對應的官方示例,很多程式碼是可以直接使用的,我們需要做的就是將資料換成自己的資料。