matplotlib:plot相关、marker样式、线样式、Text样式
0、简介
matplotlib中有两种plot绘制折线的方式,分别是
matplotlib.axes.Axes.plot(……)
matplotlib.pyplot.plot(……)
这两者的作用都是绘制折线,参数也相同,区别在于绘制的位置,Axes.plot用于在子画布上绘图,而pyplot.plot则是在总画布上绘图
比如我们有
fig, axs = plt.subplots(2, 2) # 将一个画布分为2*2的子画布,子画布通过axs访问,总画布通过fig访问
这里的fig是总画布,axs是子画布构成的ndarray,通过axs[i][j]就可以访问到具体的画布,再通过axs[i][j].plot(……)就能实现在这些子画布上操作的目的。
如果没有区分画布,则直接用pyplot.plot(……)即可
1、用法
1.1、基本用法
以上是这两种plot的区别,不过plot具体用法(即参数设置)相同,都是:
plot(*args, scalex=True, scaley=True, data=None, **kwargs)
这里就一并说明了。
该函数的作用是,用折线或标识点(markers)绘制坐标对(x,y),这两种绘制方式的区别在于折线会把坐标对代表的点相连,标识点则只绘制出坐标对代表的点(即一个是折线图,一个是点图)。
两种写法:
plot([x], y, [fmt], *, data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
其中用[ ]框起来的项都是可以省略的项。
绘制出的点或者折线的节点坐标由x,y给出。
fmt是一个可选参数,可以用它来指定一些基本的样式——颜色、标识点样式、线型。以下代码记录了部分样式的写法(具体可以在下文Notes一节查找):
plot(x, y) #用默认线型、颜色绘制折线图 plot(x, y, 'bo') #用蓝色的圆点标识绘制点图 plot(y) #绘制折线图,x坐标用[0,1,...,N-1]表示 plot(y,'r+') #点图,x坐标同上,点样式为红色、+号
我们可以用Line2D
的相关属性作为参数,在绘制时控制更多效果。Line属性和fmt可以混用,以下代码给出了相同样式的两种不同代码写法:
plot(x, y, 'go--', linewidth=2, markersize=12) plot(x, y, color='green', marker='o', linestyle='dashed', linewidth=2, markersize=12)
虽然之前说了fmt和Line属性可以混用,但当二者发生重复时,绘制结果以Line属性为标准。
1.2、绘制带标签的数据
如果数据本身带有标签,比如data={'x':x,'y':y},其中x,y为两组大小相同的数组,其标签分别为'x','y',可以通过data['x']与data['y']进行访问。如果要对data的x、y数据进行绘图,除了可以将data['x']、data['y']作为参数x、y输入外,还可以用如下方法:
plot('x', 'y', data=obj)
即将标签放在对应的x、y处,并添加data参数,这样绘制时,程序会按照data[x标签]、data[y标签]的方式进行绘制。
data的类型可以是dict、pandas.DataFrame
1.3、在一幅图中绘制多个数据集
如何在一幅图像中绘制多个数据集,每个数据集都对应一个折线或点集。
方法一、最直接的方法——多次调用plot函数
plot(x1, y1, 'bo') plot(x2, y2, 'go')
方法二、x、y是二维数组
此时有两种情况:
①x、y都是二维数组;
那么它们必须大小相同,假设都是[M,n],那么会绘制n条曲线,每条曲线由M个点构成。第i条曲线的第j个点的坐标为(x[ j ][ i ],y[ j ][ i ])
②x、y其中一个是二维数组;
假设其中一个数据的大小为[M,n],那么另一个数据就必须是一维数组,且长度为M。这样会绘制n条曲线,每个曲线由M个点构成。
假设y是二维数组,x为一维数组,那么第i条曲线的第j个点的坐标为(x[ j ],y[ j ][ i ]);
方法三、以参数 [x],y,[fmt]的方式说明每个数据集及绘制方式;
plot(x1, y1, 'g^', x2, y2, 'g-')
在这种情况下,所有额外补充的属性参数将被应用到所有数据集上。这种情况下的data属性将被禁用。
默认情况下,如果我们不特定指出线的属性,那么多条线的属性会按照内置的某种顺序循环出现,具体可见 rcParams["axes.prop_cycle"]
以颜色为例,多条线的颜色按以下顺序循环:
cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
2、参数
plot(*args, scalex=True, scaley=True, data=None, **kwargs)
2.1、*args
参数 |
类型 |
说明 |
x,y | 具体数值或者array-like |
具体的横纵坐标,如果省略x,那么x会自动规划为range(len(y)); 通常情况下,这两个参数都是1D array; 不过也可以用2D array,具体用法见1.3、方法二所说; 这两个参数在写的时候,直接写变量就行,不能写成x=...,y=...的形式 |
fmt | str | 样式字符串,该参数在传入时也是直接写变量,而不是fmt=... |
data | dict或DataFrame | 如果要传入带标签的数据,就需要用到data参数 |
2.2、其他参数
参数 |
类型 |
默认值 |
说明 |
scalex、scaley | bool | True | 是否以data的上下限作为坐标轴的显示范围 |
**kwargs | Line2D属性 | 用于表明线的具体属性(标签、线宽、颜色等) |
2.3、**kwargs
该参数用于指明线的具体的属性,这种参数在传入的时候需要写关键字,就像这样plot(...,keyword=...)
这里的Keyword见 Line2D
,罗列如下(有一些属性暂不知道用途,这里列全属性,但是只给出关键属性的用法):
参数 |
类型 |
说明 |
a filter function |
|
|
scalar or None |
透明度 |
|
bool |
||
|
bool |
|
bool |
||
Patch or (Path, Transform) or None |
||
|
color |
颜色 |
|
线的尾迹 |
|
|
连接点的样式 |
|
sequence of floats (on/off ink in points) or (None, None) |
||
(2, N) array or two 1D arrays |
|
|
|
{'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post'}, default: 'default' |
点之间的连接线样式 |
设置线所属的Figure |
||
{'full', 'left', 'right', 'bottom', 'top', 'none'} |
点的填充方式 |
|
str |
这个图形的id |
|
bool |
||
object |
这个图形的标签(用作图例) |
|
|
{'-', '--', '-.', ':', '', (offset, on-off-seq), ...} |
线形 |
|
float |
线宽 |
marker style string, |
标志点的样式,见3.1节marker |
|
|
color |
marker的边界颜色 |
|
float |
marker的边线宽度 |
|
color |
marker的颜色 |
|
color |
|
|
float |
marker的大小 |
None or int or (int, int) or slice or list[int] or float or (float, float) or list[bool] |
指定绘制marker的间隔,只绘制这些位置处的marker | |
float or callable[[Artist, Event], tuple[bool, dict]] |
||
float |
||
bool |
||
(scale: float, length: float, randomness: float) |
||
bool or None |
||
|
||
|
||
unknown |
||
str |
||
bool |
是否可见 | |
1D array |
||
1D array |
||
float |
3、样式
3.1、marker
All possible markers are defined here:
marker |
symbol |
description |
---|---|---|
|
point |
|
|
pixel |
|
|
circle |
|
|
triangle_down |
|
|
triangle_up |
|
|
triangle_left |
|
|
triangle_right |
|
|
tri_down |
|
|
tri_up |
|
|
tri_left |
|
|
tri_right |
|
|
octagon |
|
|
square |
|
|
pentagon |
|
|
plus (filled) |
|
|
star |
|
|
hexagon1 |
|
|
hexagon2 |
|
|
plus |
|
|
x |
|
|
x (filled) |
|
|
diamond |
|
|
thin_diamond |
|
|
vline |
|
|
hline |
|
|
tickleft |
|
|
tickright |
|
|
tickup |
|
|
tickdown |
|
|
caretleft |
|
|
caretright |
|
|
caretup |
|
|
caretdown |
|
|
caretleft (centered at base) |
|
|
caretright (centered at base) |
|
|
caretup (centered at base) |
|
|
caretdown (centered at base) |
|
|
nothing |
|
|
Render the string using mathtext. E.g |
|
|
A list of (x, y) pairs used for Path vertices. The center of the marker is located at (0, 0) and the size is normalized, such that the created path is encapsulated inside the unit cell. |
3.2、颜色
character |
color |
---|---|
|
blue |
|
green |
|
red |
|
cyan |
|
magenta |
|
yellow |
|
black |
|
white |
3.3、Linestyle
其中Named Linestyles可以直接通过写线的名字来表示,就像这样:
plot(...,linestyle='solid')
其他的线性则要用Tuple的形式写:
plot(...,linestyle=(0, (1, 10)),...)
3.4、Text样式
图像中的一个文本是一个Text对象,它的最基本的属性是位置坐标x,y和文本字符串text。
其他属性罗列如下,只介绍部分常用的:
Property |
Description |
说明 |
---|---|---|
a filter function |
||
scalar or None |
透明度 |
|
bool |
||
color |
背景色 |
|
dict with properties for |
||
unknown |
||
unknown |
||
unknown |
||
|
color |
文字颜色 |
所属画布 |
||
|
{FONTNAME, 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'} |
|
|
||
|
float or {'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'} |
文字大小 |
|
{a numeric value in range 0-1000, 'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded'} |
|
|
{'normal', 'italic', 'oblique'} |
文字字体 |
|
{'normal', 'small-caps'} |
|
|
{a numeric value in range 0-1000, 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black'} |
样式(黑体、斜体等) |
str |
||
|
{'center', 'right', 'left'} |
|
bool |
||
object |
文字标签 |
|
float (multiple of font size) |
||
str |
||
|
{'left', 'right', 'center'} |
|
bool |
||
None or bool or float or callable |
||
(float, float) |
位置 |
|
bool |
||
float or {'vertical', 'horizontal'} |
旋转度数 |
|
{None, 'default', 'anchor'} |
||
(scale: float, length: float, randomness: float) |
||
bool or None |
||
object |
文本 |
|
bool |
||
str |
||
bool or None |
||
|
{'center', 'top', 'bottom', 'baseline', 'center_baseline'} |
|
bool |
是否可见 |
|
bool |
||
float |
横坐标 |
|
float |
纵坐标 |
|
float |