不百度画出好看的图

🤔你受够了每次使用matplotlib都离不开baidu/google/bing的生活了吗?

弄懂plt.***ax.***的区别

在matplotlib中,有两种画图方式:

  • plt.figure()
  • fig, ax = plt.subplots()

第一种其实是取了一个捷径,这是通过matplotlib提供的一个api,这个plt提供了很多基本的function可以让你很快的画出图来。但是正因为这个简便性,网上大部分教程都是基于第一种方法的,让很多人以为matplotlib的功能仅限于此,但是偶尔遇到第二种绘画方式就会让人摸不着头脑。在此十分感谢知乎上的一个回答:__matplotlib:先搞明白plt. /ax./ fig再画__。

如果想要更细致的精调,就要使用第二种方法。__第二种方法是最正统的__。

1
2
fig, ax = plt.subplots()
ax.plot(A,B)

官网提供了一张图说明白一张图的各种组件指什么。

  • Figure:这个很好理解,就是一张画布。
  • Axes:首先,这个不是Axis,不是坐标轴!!而是放在画布上的各种物体!!
  • Axis:这个才是坐标轴……

知道了这些部分,就能大致看懂为什么可以使用ax.plot()绘画了,实际上这里的ax就是axes。

那么使用最正统方法绘制图的流程是什么样的呢?

  1. 首先创建一个画布

    1
    fig, ax = plt.subplots()

    如果subplots里给定了axes的数量,那么得到的ax也就是一个数组了。

    1
    2
    3
    fig, ax = plt.subplots(2,1) # 创建多个绘画对象
    ax[0].***
    ax[1].***
  2. 在axes上画数据

    这里实际上操作axes,不同的ax互不干扰,可以选择画任何类型的图,可以参考“图像类型”。

    当然如果要让多条曲线出现在同一个ax上,那么多次用该ax绘画即可。

    1
    2
    ax.plot(x,y)
    ax.plot(y,x)
  3. 细节处理

    细节也可以在axes上进行设定,一张图上有哪些组件可以参考“参数关键字”。一般来说就是设定横纵坐标,添加图例等。

    1
    2
    ax.set_title("title")
    ax.legend()
  4. 展示图片

    最后一步可以用fig把所有的对象打印粗来了。

    1
    fig.show()

图像类型

至于画什么要用到啥,看这个:50种常用的matplotlib可视化,再也不用担心模型背着我乱跑了

类型 调用API
坐标图 plt.plot(x, y, fmt)
箱形图 plt.boxplot(data, notch, position)
条形图 plt.bar(left, height, width, bottom)
横向条形图 plt.barh(width, bottom, left, height)
极坐标图 plt.polar(theta, r)
功率密度图 plt.psd(x, NFFT=256, pad_to, Fs)
谱图 plt.specgram(x, NFFT=256, pad_to, F)
X-Y 相关性函数 plt.cohere(x, y, NFFT=256, FS)
散点图 plt.scatter(x, y)
步阶图 plt.step(x, y, where)
直方图 plt.hist(x, bins, normed)
等值图 plt.contour(X, Y, Z, N)
垂直图 plt.vlines()
柴火图 plt.stem(x, y, linefmt, markerfmt)
数据日期 plt.plot_date()

参数关键字

如果要绘制一个更加精细的图片,往往需要修改各种参数,下面这张图说的就是这些参数的关键字。

绘画风格

绘画风格

使用控制曲线的格式字符串,可以绘制可视化效果更佳的图。可选颜色字符、风格字符和标记字符。

颜色字符

颜色字符 说明 颜色字符 说明
b 蓝色 g 绿色
r 红色 c 青绿色 cyan
m 洋红色 magenta y 黄色
k 黑色 w 白色
#008000 可以使用RGB颜色 0.8 灰度值

风格字符

风格字符 说明
- 实线
-- 破折线
-. 点划线
: 虚线

标记字符

标记字符 说明 标记字符 说明
. , 像素标记(极小点)
o 实心圆 v 倒三角
^ 上三角 > 左三角
< 右三角 1 下花三角
2 上花三角 3 左花三角
4 右花三角 s 实心方形
p 实心五角 * 星形
h 竖六边形 H 横六边形
+ 十字 x x标记
d 瘦菱形 D 菱形
` ` 垂直线

其他细节

中文支持

matplotlib的默认设置并不支持中文,在有中文输出的地方,需要更改一下字体,需要一个属性:fontproperties

1
2
ax.xlabel("时间", fontproperties="SimHei", fontsize=20)
ax.ylabel("振幅", fontproperties="SimHei", fontsize=20)

绘制3D图像

绘制3D需要用到Axes3D,例子如下:

1
2
3
4
5
6
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(xxx)

读取二进制图像

matplotlib似乎没有相关的api可以用来读取二进制图像,但是很多时候却经常要用到二进制格式的图像,这个时候需要使用其他方法来处理二进制数据

方法1.1——使用io模块

1
2
3
4
5
from io import BytesIO
import requests
r = requests.get('http://example.com/img/6.png')
plt.imshow(plt.imread(BytesIO(r.content)))
plt.show()

方法1.2——还是使用io模块

1
2
3
4
buffer = io.BytesIO()
canvas.print_png(buffer)
data = buffer.getvalue()
buffer.close()

方法2——使用numpy

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
import numpy as np

f = open('bwall.bmpx', mode='rb')
x = np.fromfile(f, dtype=np.ubyte)

x = x[1920:3840]
x = x.reshape(60,32)

plt.imshow(x)
plt.axis('off')  # clear x- and y-axes
plt.show()

用matplotlib绘制简单的动画

用matplotlib绘制3d图像的一些例子(动图):使用Matplotlib绘制3D图形-制作动图