數據科學 IPython 筆記本 8.14 自定義 Matplotlib:配置和樣式表

8.14 自定義 Matplotlib:配置和樣式表

原文:Customizing Matplotlib: Configurations and Stylesheets

譯者:飛龍

協議:CC BY-NC-SA 4.0

本節是《Python 數據科學手冊》(Python Data Science Handbook)的摘錄。

Matplotlib 的默認繪圖設置通常是其用戶所抱怨的主題。雖然在 2016 年末的 Matplotlib 2.0 版本中有很多改進的內容,但自定義默認設置的能力,有助于使軟件包符合你自己的審美偏好。

在這里,我們將介紹一些 Matplotlib 的運行時配置(rc)選項,并查看較新的樣式表功能,其中包含一些不錯的默認配置。

手動的繪圖自定義

通過本章,我們已經看到了如何調整單個繪圖設置,最終得到看起來比默認設置更好一些的東西。可以為每個單獨的繪圖執行這些自定義。例如,這是一個相當單調的默認直方圖:

import matplotlib.pyplot as plt
plt.style.use('classic')
import numpy as np

%matplotlib inline

x = np.random.randn(1000)
plt.hist(x);
png

我們可以手動調整它,使其看上去好看一些:

# 使用灰色背景
ax = plt.axes(axisbg='#E6E6E6')
ax.set_axisbelow(True)

# 繪制白色實網格線draw solid white grid lines
plt.grid(color='w', linestyle='solid')

# 隱藏軸的刻度
for spine in ax.spines.values():
    spine.set_visible(False)
    
# 隱藏頂部和右側刻度
ax.xaxis.tick_bottom()
ax.yaxis.tick_left()

# 將刻度和標簽變亮
ax.tick_params(colors='gray', direction='out')
for tick in ax.get_xticklabels():
    tick.set_color('gray')
for tick in ax.get_yticklabels():
    tick.set_color('gray')
    
# 控制直方圖的人臉和邊界顏色
ax.hist(x, edgecolor='#E6E6E6', color='#EE6666');
png

這看起來更好,你可能會認為外觀受 R 語言的ggplot可視化包的啟發。但這需要付出很多精力!我們絕對不希望每次創建繪圖時都要做所有調整。幸運的是,有一種方法可以調整這些默認值,它將適用于所有繪圖。

修改默認值:rcParams

每次加載 Matplotlib 時,它都會定義一個運行時配置(rc),其中包含你創建的每個繪圖元素的默認樣式。可以使用plt.rc便利例程隨時調整此配置。讓我們修改rc參數,使我們的默認繪圖看起來與之前相似,并看看它的樣子。

我們首先保存當前rcParams字典的副本,這樣我們就可以在當前會話中輕松重置這些更改:

IPython_default = plt.rcParams.copy()

現在我們可以使用plt.rc函數來改變其中的一些設置:

from matplotlib import cycler
colors = cycler('color',
                ['#EE6666', '#3388BB', '#9988DD',
                 '#EECC55', '#88BB44', '#FFBBBB'])
plt.rc('axes', facecolor='#E6E6E6', edgecolor='none',
       axisbelow=True, grid=True, prop_cycle=colors)
plt.rc('grid', color='w', linestyle='solid')
plt.rc('xtick', direction='out', color='gray')
plt.rc('ytick', direction='out', color='gray')
plt.rc('patch', edgecolor='#E6E6E6')
plt.rc('lines', linewidth=2)

通過定義這些設置,我們現在可以創建一個繪圖并查看我們的設置:

plt.hist(x);
png

讓我們看看使用rc參數,簡單線條圖是什么樣:

for i in range(4):
    plt.plot(np.random.rand(10))
png

我發現這比默認樣式更美觀。如果你不同意我的審美,好消息是你可以根據自己的喜好調整rc參數!這些設置可以保存在.matplotlibrc文件中,你可以閱讀 Matplotlib 文檔來了解。也就是說,我更喜歡使用樣式表來定制 Matplotlib。

樣式表

2014 年 8 月發布的 Matplotlib 1.4 版增加了一個非常方便的style模塊,其中包含許多新的默認樣式表,以及創建和打包自己的樣式的功能。這些樣式表的格式與前面提到的.matplotlibrc文件類似,但必須使用.mplstyle擴展名來命名。

即使你不創建自己的樣式,默認包含的樣式表也非常有用。可用的樣式在plt.style.available中列出 - 這里為了簡潔我只列出前五個:

plt.style.available[:5]

'''
['fivethirtyeight',
     'seaborn-pastel',
     'seaborn-whitegrid',
     'ggplot',
     'grayscale']
'''

切換樣式表的基本方法是調用:

plt.style.use('stylename')

但請記住,這將改變會話剩余部分的風格!或者,你可以使用樣式上下文管理器,它可以臨時設置樣式:

with plt.style.context('stylename'):
    make_a_plot()

讓我們創建一個函數,它將生成兩種基本類型的繪圖:

def hist_and_lines():
    np.random.seed(0)
    fig, ax = plt.subplots(1, 2, figsize=(11, 4))
    ax[0].hist(np.random.randn(1000))
    for i in range(3):
        ax[1].plot(np.random.rand(10))
    ax[1].legend(['a', 'b', 'c'], loc='lower left')

我們將使用它,以及各種內置樣式的樣式來探索這些繪圖。

默認樣式

默認樣式是我們到目前為止所看到的內容;我們將從它開始。首先,讓我們將運行時配置重置為筆記本默認值:

# 重置 rcParams
plt.rcParams.update(IPython_default);

現在讓我們看看它的外觀:

hist_and_lines()
png

FiveThiryEight 樣式

fivethirtyeight風格模仿流行的 FiveThirtyEight 網站上的圖形。正如你在這里看到的那樣,它以深色,粗線條和透明的軸為代表:

with plt.style.context('fivethirtyeight'):
    hist_and_lines()
png

ggplot

R 語言中的ggplot包是非常流行的可視化工具。Matplotlib 的ggplot樣式模仿該包的默認樣式:

with plt.style.context('ggplot'):
    hist_and_lines()
png

“黑客的貝葉斯方法”風格

有一本非常好的在線簡短書籍,叫做黑客的概率編程和貝葉斯方法;它具有使用 Matplotlib 創建的圖形,并使用一組很好的rc參數,在整本書中創建一致且視覺上吸引人的風格。這種風格在bmh樣式表中復現:

with plt.style.context('bmh'):
    hist_and_lines()
png

暗黑背景

對于演示文稿中使用的圖形,使用深色而非淺色背景通常很有用。dark_background樣式提供了這個:

with plt.style.context('dark_background'):
    hist_and_lines()
png

灰度

有時你可能會發現,自己正在為不接受彩色圖形的印刷出版物準備圖形。為此,此處展示的“灰度”樣式非常有用:

with plt.style.context('grayscale'):
    hist_and_lines()
png

Seaborn 樣式

Matplotlib 還有受 Seaborn 庫啟發的樣式表(在“可視化和 Seaborn”中進行了更全面的討論)。正如我們將看到的,將 Seaborn 導入筆記本時,這些樣式會自動加載。我發現這些設置非常好,并且傾向于在我自己的數據探索中將它們用作默認設置。

import seaborn
hist_and_lines()
png

使用所有這些用于各種繪圖樣式的內置選項,對于交互式可視化和用于出版圖形的創建,Matplotlib 變得更加有用。在本書中,我通常會在創建繪圖時使用這些樣式約定中的一個或多個。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容