Python可视化 | xarray绘图样式配置

2021-08-26 17:23:18 浏览数 (1)

Photo by bady abbas on Unsplash

样式配置文件

Matlibplot 每次加载前都会载入运行时配置文件(rc, runtime configuration). 这个文件包含如何创建图形元素默认风格的信息。

所修改的参数值仅在当前 Python 会话中有效。若重启 Python 且不运行参数修改代码,则仍为参数仍为默认值。

默认风格信息可通过plt.rcParams获得。这些参数是通过字典的方式存储的。

代码语言:javascript复制
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams

plt.rcParams

下面尝试一下修改参数'font.size': 10.0'font.size': 18.0.

'font.size': 10.0

用修改字典元素的方式修改参数font.size

代码语言:javascript复制
plt.rcParams['font.size'] = 18

尝试绘图确认是否修改成功全局字体大小是否修改成功

代码语言:javascript复制
x = np.arange(1,11)
y = x **2
plt.plot(x,y)
plt.title("Fontsize = 18")

Fontsize = 18

若需修改回默认样式,可使用matplotlib.rcdefaults实现。

代码语言:javascript复制
import matplotlib as mpl
mpl.rcdefaults()

x = np.arange(1,11)
y = x **2
plt.plot(x,y)
plt.title("Default Fontsize")

Default Fontsize

预设样式表

除了可以在 Matlibplot 中自定义样式以外,还可以使用 Matlibplot 内置样式快速绘图配置。

样式的修改依赖于 Matlibplot.pyplot 中的 style 模块实现的。内置样式以文本形式存储,文件后缀为.mplstyle.

使用样式表的方法很简单,主要有两种使用方式:全局使用、局部使用。

全局使用

设置全局使用后,plt.style.use后的绘图将全部设置为新样式。

代码语言:javascript复制
import matlibplot.pyplot as plt
# 使用经典风格绘图
plt.style.use("classic")
...(绘图代码,均使用classic 风格绘图)

局部使用

局部使用可在with方法中使用上下样式管理器(context manager)实现在方法体内部临时切换样式表。

代码语言:javascript复制
import matlibplot.pyplot as plt

with plt.style.context("classic")
  ...(绘图代码,使用classic 风格绘图)

...(绘图代码,使用default 风格绘图)

内置样式表

Matlibplot 配置了 12 种默认样式表。

  1. 默认风格(default)
  1. 经典风格(classic)
  1. Solarize_Light2
  1. _classic_test_patch
  1. bmh

本样式集来自Bayesian Methods for Hackers[1] 一书。对科学绘图而言,本样式是一个良好的解决方案。

  1. dark_background
  1. fast
  1. fivethirtyeight

本样式集模仿了著名数据记者 Nate Silver 创办网站Fivethirtyeight[2]的外观。

  1. ggplot

本样式集来自于 R 语言的同名绘图系统 ggplot2. 该样式集它在呈现数据方面吸取了很多最新的解决方案,并注重数据可视化的简单性。

  1. grayscale
  1. seaborn 系列

本样式表系列来自 Seaborn 包中的一组样式集[3]。Seaborn 包为 Matlibplot 提供更多附加功能并改善默认的 matplotlib 绘图样式。

<<< 左右滑动见更多 >>>

<<< 左右滑动见更多 >>>

  1. tableau-colorblind10

Tableau[4] 是一款著名可视化探索分析数据的软件。本样式表模仿 Tableau 的风格,可呈现出类似的视觉效果。

Tableau Logo

XKCD 手绘样式

XKCD[5] 是一个关于浪漫、隐喻、数字、以及语言的漫画网站。xkcd 是兰道尔·门罗(Randall Munroe)的网名,又是他所创作的漫画的名称,其漫画创作的手绘风格尤其引人注目。

Immune Factory(https://xkcd.com/2491/,CC-BY-NC 2.5)

matlibplot 提供了方法plt.xkcd[6]以便将默认风格转换为 XKCD 样式。

下面给出几个局部使用 XKCD 样式的例子。

下述绘图均在 Windows 系统下绘制,linux 系统可能需要自行修改参数rcParams以便获得最佳的字体呈现效果。

Windows 系统一般情况下无需以下操作。若无法获得理想的效果,可通过修改参数rcParams实现自定义全局字体

代码语言:javascript复制
import matplotlib as mpl
import matplotlib.font_manager as fm
fe = fm.FontEntry(
    fname='..\xkcd.ttf',
    name='xkcd')
fm.fontManager.ttflist.insert(0, fe)
mpl.rcParams['font.family'] = fe.name

所需字体xkcd.ttf可通过在后台回复xarray获得。参数fname='..\xkcd.ttf'需提供字体所在的路径。

首先导入数据

代码语言:javascript复制
import xarray as xr
import matplotlib.pyplot as plt
import numpy as np

ds1 = xr.open_dataset("..\air.2020.nc", drop_variables = ["time_bnds"]).sel(level = 850).rename({"air": "Tair"})
ds = ds1.sortby("lat", ascending= True)

uwnd_raw = xr.open_dataset("..\uwnd.2020.nc", drop_variables = ["time_bnds"]).sel(level = 850, lon = slice(0, 160), lat=slice(85, 12)).uwnd.isel(time = 5)
vwnd_raw = xr.open_dataset("..\vwnd.2020.nc", drop_variables = ["time_bnds"]).sel(level = 850, lon = slice(0, 160), lat=slice(85, 12)).vwnd.isel(time = 5)
uwnd = uwnd_raw.sortby("lat", ascending= True)
vwnd = vwnd_raw.sortby("lat", ascending= True)
winddata_dense_raw = xr.Dataset(data_vars={"uwnd": uwnd, "vwnd": vwnd})
winddata_dense = winddata_dense_raw.assign(windspeed = np.hypot(winddata_dense_raw.uwnd, winddata_dense_raw.vwnd))
winddata_thin = winddata_dense.thin(lat=2, lon=2)

绘制 Matlibplot 默认绘图

代码语言:javascript复制
ds.Tair.mean(dim = ('lat', 'lon')).plot(figsize=(12,5))

使用关键词with以便局部使用 XKCD 样式

代码语言:javascript复制
with plt.xkcd():
    ds.Tair.plot(figsize=(12,5))

绘制一维线图

代码语言:javascript复制
with plt.xkcd():
    ds.Tair.mean(dim = ('lat', 'lon')).plot(figsize=(12,5))

绘制二维 pcolormesh

代码语言:javascript复制
with plt.xkcd():
    ds.Tair.mean(dim = ('time')).plot(figsize=(12,5))

绘制箭头风场(quiver)图

代码语言:javascript复制
with plt.xkcd():
    fig, ax = plt.subplots(figsize=(12,5))
    winddata_thin.plot.quiver(x="lon", y="lat", u="uwnd", v="vwnd", ax=ax)

绘制流场图

代码语言:javascript复制
with plt.xkcd():
    fig, ax = plt.subplots(figsize=(12,8))
    winddata_thin.plot.streamplot(x="lon", y="lat", u="uwnd", v="vwnd", hue="windspeed",
                                            ax=ax,
                                            cbar_kwargs = {
                                                "orientation": "horizontal",
                                                "aspect": 40,
                                                "pad": 0.15,
                                                "label": "Wind Speed [m/s]",
                                                },
                                            linewidth = 1.5,
                                            cmap = "plasma",
                                            )

参考资料

[1]

Bayesian Methods for Hackers: http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/

[2]

Fivethirtyeight: https://fivethirtyeight.com/

[3]

样式集: http://seaborn.pydata.org/tutorial/aesthetics.html

[4]

Tableau: https://www.tableau.com/

[5]

XKCD: https://xkcd.com/

[6]

plt.xkcd: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xkcd.html

# TIPS #

Xarray专题资料下载可在公众号前台回复xarray 获取。

0 人点赞