1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图

Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图

时间:2021-12-21 03:29:05

相关推荐

Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图

介绍

本文不是一篇详尽的、从简到繁的 Matplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的、基础的操作。本文不对各种数据图(折线图、柱状图等)作介绍。文中配有效果示意图及代码。本文亦可作常用画图函数/参数查询之用。

写在前面

什么样的数据图才是好的?

图之好坏不在繁简,一副好图,应该让读者能清晰明了地理解你想要表达的意思。所以在设计图的时候,此为第一要义。

检查你的数据图

是否对色盲友好?(避免过多地使用红绿配色。)如果打印成黑白稿(grayscale)的话,读者是否还能分辨出不同的元素?(避免仅使用颜色来区分元素,使用恰当、对比度高的颜色,以及 Marker、线的样式、粗细等)图片的质量是否足够高?(PDF、EPS 等矢量图、分辨率高的 PNG、JPG)标题、标签、刻度、图例是否正确,表达清楚?(最好不要仅使用数学符号来表示轴标签,例如 α \alpha α、 β \beta β 等,使用明确的文字来描述。)使用的字体与正文是否一致?

文章目录

介绍写在前面什么样的数据图才是好的?检查你的数据图 基础知识环境常用链接 正文开始画图Figure 画板创建一个简单的画板并展示设定画板的长宽`figsize`设定子图访问不同的字图紧凑布局 Tight Layout规则的栅格布局 Grid画板背景色图中图 Inset 标签 Label设定图片的轴标签、标题、字体颜色、字体大小 轴 Axes/Axis设定轴的范围设定轴的缩放 Scale设定轴的上下界、粗细、颜色隐藏轴设定右(上)坐标轴 Tick 刻度设置刻度的长、宽、颜色自定义刻度的位置和标签显示(隐藏)主/次刻度 Legend 图例设定图例位置和文字大小设定图例位置多行多列图例、图例背景颜色 网格 Grid其他命令减小生成的文件大小文字 Text设定字体引入 LaTeX \LaTeX LATE​X 包使用 TrueType 字体(或避免 Type 3 字体)设定层级 `zorder`透明 `alpha`设置颜色地图:例一 `colormap`设置颜色地图:例二 `colormap`打印出系统中支持的字体名 Reference

基础知识

在介绍其他内容之前,我们先回顾一下基础知识,这里借用 Matplotlib 文档的一张图 [1]:

图中共标出了14种概念:

Figure - 画板Title - 标题X axis label - X轴标签Y axis label - Y轴标签Legend - 图例Major tick label - 主刻度标签Minor tick label - 次刻度标签Grid - 网格Line (line plot) - 线Markers (scatter plot) - 标记Major tick - 主刻度Minor tick - 次刻度Axes - 轴Spines - 脊

这些基础概念十分有用,希望大家能记住其作用及对应的英文。如果遇到更复杂的需求,可以直接在官网文档中进行查询。

环境

Python 3.7.3Matplotlib 3.1.3

常用链接

颜色 Colors

Choosing Colormaps in Matplotlib - List of Named Colors - HTML Color Picker - Color Brewer 2.0 - How to find a color scheme that’s also useful when printed in black and white?

线样式

Linestyle - Line2D

标记样式:

Markers - Marker filling

刻度

Tick Locators - Tick Formatters

图例:Legend Guide

正文

开始画图

import matplotlib.pyplot as plt # 之后的代码默认引入此包

Figure 画板

创建一个简单的画板并展示

fig, ax = plt.subplots()plt.show() # 之后的代码默认省略此步骤

设定画板的长宽figsize

fig, ax = plt.subplots(figsize=(12, 3))

设定子图

fig , ax = plt.subplots(nrows=3, ncols=5)

nrowsncols参数分别为行数和列数。更复杂的例子请参考官网教程。

访问不同的字图

假设现在有三行五列:

ax[0, 4].plot(x, y, color='limegreen')ax[2, 2].plot(x, y, color='red')

紧凑布局 Tight Layout

fig, ax = plt.subplots(tight_layout=True)

规则的栅格布局 Grid

import matplotlib.pyplot as pltfrom matplotlib.gridspec import GridSpecfig = plt.figure()gs = GridSpec(2, 5, width_ratios=[1, 1, 1, 1, 2], height_ratios=[2.5, 1])ax00 = fig.add_subplot(gs[0])ax01 = fig.add_subplot(gs[1])ax02 = fig.add_subplot(gs[2])ax03 = fig.add_subplot(gs[3])ax04 = fig.add_subplot(gs[4])ax10 = fig.add_subplot(gs[5])ax12 = fig.add_subplot(gs[6])ax13 = fig.add_subplot(gs[7])ax14 = fig.add_subplot(gs[8])ax14 = fig.add_subplot(gs[9])plt.show()

画板背景色

ax.set_facecolor('lightblue')

图中图 Inset

ax.plot(x, y, color='limegreen', label='Xovee')inset = plt.axes((.5, .5, .3, .3), facecolor='lightblue')# the four-tuple means (left, bottom, width, height)inset.plot(x, y, color='red')

标签 Label

设定图片的轴标签、标题、字体颜色、字体大小

plt.title()plt.xlabel()plt.ylabel()plt.set_title()ax.set_xlabel()ax.set_ylabel()

ax.set_title("Xovee's Figure", fontsize=24, color='red')ax.set_xlabel('Xovee', fontsize=20, color='lightblue')ax.set_ylabel('Xovee', fontsize=20, color='coral')

轴 Axes/Axis

设定轴的范围

ax.set_xlim(np.pi, 3*np.pi)ax.set_ylim(-.5, .5)

设定轴的缩放 Scale

可选项包括:

linear默认logsymloglogit

fig, ax = plt.subplots(ncols=2, figsize=(8, 4), tight_layout=True)x = np.linspace(0, 100, 1000)y = [2**x_ for x_ in x]ax[0].plot(x, y, color='limegreen', label='Xovee')ax[1].plot(x, y, color='coral')ax[1].set_yscale('log')

设定轴的上下界、粗细、颜色

ax.plot(x, y, color='limegreen', label='Xovee')ax.set_yticks([-.5, 0., .5])ax.set_xticks([2, 4, 6, 8])ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['left'].set_bounds(-.5, .5)ax.spines['bottom'].set_bounds(2, 8)ax.spines['bottom'].set_linewidth(2)ax.spines['bottom'].set_color('red')

隐藏轴

hide_axes = ['left', 'top', 'right', 'bottom']for axis in hide_axes:ax.spines[axis].set_visible(False)

读者可以关注一下这个ax.spines,即轴的脊椎,将其可见度设为False

如果啥axis都不想要(包括label等),可以使用下面的命令:

ax.set_axis_off()

设定右(上)坐标轴

ax.twinx(),同理可以设置上坐标轴ax.twiny()

ax.plot(x, y, color='limegreen', label='Xovee')axr = ax.twinx()axr.set_yticks([.5])axr.set_yticklabels(['Xovee'])

Tick 刻度

设置刻度的长、宽、颜色

# axis 默认是 both, 或者 x 和 y# which 可以是 major, minor, bothax.tick_params(axis='both', which='major', color='blue', length=10, width=3)

自定义刻度的位置和标签

plt.xticks()plt.yticks()ax.set_xticks()ax.set_xticklabels()ax.set_yticks()ax.set_yticklabels()

import matplotlib.pyplot as pltimport numpy as npfig, ax = plt.subplots(tight_layout=True)x = np.linspace(0, 4*np.pi, 100)y = np.sin(x)plt.plot(x, y, color='limegreen', label='Xovee')plt.xticks([0, np.pi, 2*np.pi, 3*np.pi, 12], ['0.0', '$\pi$', '$2\pi$', '3$\pi$', '12'], fontsize=16, rotation=30, color='red')plt.yticks([-1, 0, 1], fontsize=16, color='blue')plt.show()

显示(隐藏)主/次刻度

右轴显示minor次刻度,下轴不显示minor次刻度。

ax.set_xticks([1e1, 1e2, 1e4], minor=True)ax.set_yticks([1e-4, 1e-2, 1e0], minor=False)

Legend 图例

设定图例位置和文字大小

loc的可选参数包括best,lower,upper,center,left,right及其部分组合例如lower left

plt.legend(loc='lower center', fontsize=24)

设定图例位置

bbox_to_anchor参数的四元组,以左下角为参照,设定图例的位置:

plt.legend(loc='lower left', bbox_to_anchor=(0, 1.05, .5, 1.05), fontsize=24)

多行多列图例、图例背景颜色

legend = plt.legend(loc='lower left', ncol=3, fontsize=16)legend.get_frame().set_facecolor('linen')

网格 Grid

fig, ax = plt.subplots(ncols=3, tight_layout=True)x = np.linspace(0, 4*np.pi, 100)y = np.sin(x)ax[0].plot(x, y, color='limegreen', label='Xovee')ax[1].plot(x, y, color='red', label='Xovee')ax[2].plot(x, y, color='blue', label='Xovee')ax[0].grid(axis='x', linestyle='--')ax[1].grid(axis='y', linewidth=5)ax[2].grid(color='purple')

其他命令

减小生成的文件大小

添加rasterized=True参数。

plt.plot(x, y, rasterized=True)plt.scatter(x, y, rasterized=True)...

文字 Text

ax.text(2, 0, 'Xovee Xu is watching you!!!', fontsize=12, weight='bold', color='Coral')

设定字体

from matplotlib import rcParamsrcParams['font.family'] = 'Times New Roman'

引入 LaTeX \LaTeX LATE​X 包

plt.rcParams['text.latex.preamble'] = [r'\usepackage{bm}']ax.set_ylabel('$\bm{\sigma}$')

使用 TrueType 字体(或避免 Type 3 字体)

第一种方法是更改配置文件,即默认之后所有的画图都使用 TrueType 字体:

首先找到并修改matplotlib文件如果你不知道该文件的位置,在 python 中输入以下命令 [2]

>>> import matplotlib>>> matplotlib.matplotlib_fname()'/home/foo/.config/matplotlib/matplotlibrc'

修改以下两项即可 [3]

pdf.fonttype : 42ps.fonttype : 42

注意:使用 TrueType 字体会显著增大 PDF 图片或文件的大小。

第二种方法是在单个画图代码中使用如下命令:

import matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42

设定层级zorder

zorder高的元素显示在zorder低低元素之上。

ax[0].scatter([0], [2], s=1e5)ax[0].scatter([0], [0], s=1e5, c='red')ax[1].scatter([0], [2], s=1e5, zorder=5)ax[1].scatter([0], [0], s=1e5, c='red', zorder=3)

透明alpha

设定alpha参数,1为不透明,0为完全透明。

ax.scatter([0], [2], s=1e5, c='green', alpha=.5)ax.scatter([0], [0], s=1e5, c='yellow', alpha=.5)ax.scatter([-1], [1], s=3e4, c='red', zorder=0)ax.scatter([1], [1], s=3e4, c='blue', alpha=1.)

设置颜色地图:例一colormap

各种colormap颜色参考值可以在这里找到。

fig, ax = plt.subplots(tight_layout=True)x = np.linspace(0, 4*np.pi, 100)y = np.sin(x)cmp = plt.cm.get_cmap('rainbow')for i in range(len(x)-1):plt.plot([x[i], x[i+1]], [y[i], y[i+1]], linewidth=5, color=cmp(x[i]/max(x)))

设置颜色地图:例二colormap

ax.scatter(x, y, s=x**2, c=y, cmap='rainbow')

打印出系统中支持的字体名

import matplotlib.font_managera = sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])for i in a:print(i)

如果你在系统中安装了新的字体,但并没有出现在上述代码所列出的字体里,可以执行下面的代码更新字体索引 [4]:

# update font cachesudo fc-cache -fv# clear matplotlib font cacherm -fr ~/.cache/matplotlib

Reference

Usage Guide. (Mar 20, ). Retrieved from /tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-pyCustomizing Matplotlib with style sheets and rcParams. (Apr 8, ). Retrieved from /tutorials/introductory/customizing.htmlJamie Oaks. (Mar 1, ). Avoiding Type 3 fonts in matplotlib plots. Retrieved from /matplotlib-fonts/Simone Centellegher. (May 2, ). Add custom fonts to Matplotlib. Retrieved from https://scentellegher.github.io/visualization//05/02/custom-fonts-matplotlib.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。