8.14 自定義 Matplotlib:配置和樣式表
原文:Customizing Matplotlib: Configurations and Stylesheets
譯者:飛龍
本節是《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);
我們可以手動調整它,使其看上去好看一些:
# 使用灰色背景
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');
這看起來更好,你可能會認為外觀受 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);
讓我們看看使用rc
參數,簡單線條圖是什么樣:
for i in range(4):
plt.plot(np.random.rand(10))
我發現這比默認樣式更美觀。如果你不同意我的審美,好消息是你可以根據自己的喜好調整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()
FiveThiryEight 樣式
fivethirtyeight
風格模仿流行的 FiveThirtyEight 網站上的圖形。正如你在這里看到的那樣,它以深色,粗線條和透明的軸為代表:
with plt.style.context('fivethirtyeight'):
hist_and_lines()
ggplot
R 語言中的ggplot
包是非常流行的可視化工具。Matplotlib 的ggplot
樣式模仿該包的默認樣式:
with plt.style.context('ggplot'):
hist_and_lines()
“黑客的貝葉斯方法”風格
有一本非常好的在線簡短書籍,叫做黑客的概率編程和貝葉斯方法;它具有使用 Matplotlib 創建的圖形,并使用一組很好的rc
參數,在整本書中創建一致且視覺上吸引人的風格。這種風格在bmh
樣式表中復現:
with plt.style.context('bmh'):
hist_and_lines()
暗黑背景
對于演示文稿中使用的圖形,使用深色而非淺色背景通常很有用。dark_background
樣式提供了這個:
with plt.style.context('dark_background'):
hist_and_lines()
灰度
有時你可能會發現,自己正在為不接受彩色圖形的印刷出版物準備圖形。為此,此處展示的“灰度”樣式非常有用:
with plt.style.context('grayscale'):
hist_and_lines()
Seaborn 樣式
Matplotlib 還有受 Seaborn 庫啟發的樣式表(在“可視化和 Seaborn”中進行了更全面的討論)。正如我們將看到的,將 Seaborn 導入筆記本時,這些樣式會自動加載。我發現這些設置非常好,并且傾向于在我自己的數據探索中將它們用作默認設置。
import seaborn
hist_and_lines()
使用所有這些用于各種繪圖樣式的內置選項,對于交互式可視化和用于出版圖形的創建,Matplotlib 變得更加有用。在本書中,我通常會在創建繪圖時使用這些樣式約定中的一個或多個。