A place for study and research

Python 100 Days Day76 Introduction to Seaborn and Pyecharts

|

author: jackfrued

數據可視化-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 官方網站的左側導航欄中找到“圖表類型”選項,下面每種類型的圖表都有對應的官方示例,很多代碼是可以直接使用的,我們需要做的就是將數據換成自己的數據。

Comments