【matplotlib】绘图方法汇总1



2017年09月25日    Author:Guofei

文章归类: 0x70_可视化    文章编号: 721

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2017/09/25/matplotlib2.html


对数坐标图

根据x, y 轴分别是否为对数,总共4种:

plot()
semilogx()
semilogy()
loglog()

示例:

import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(1,10,1000)
y=np.sin(x)

plt.subplot(221)
plt.plot(x,y)
plt.subplot(222)
plt.semilogx(x,y)
plt.subplot(223)
plt.semilogy(x,y)
plt.subplot(224)
plt.loglog(x,y)

plt.show()

matplotlib3_1.png

极坐标绘图

仅需要这样:

plt.subplot(111,polar=True)

示例:

import numpy as np
import matplotlib.pyplot as plt
theta=np.linspace(0,2*np.pi,100)
rho=1-np.sin(theta)
plt.subplot(111,polar=True)
plt.plot(theta,rho)
plt.show()

matplotlib3_2.png

统计绘图

bar

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5])
y1 = x
y2 = x ** 1.5

width = 0.2
plt.bar(x, y1, width)
plt.bar(x + width, y2, width)
plt.show()

这里做了个小技巧,用width作为偏移,画出多个bar matplotlib3_3.png

scatter

scatter与plot的不同是,scatter可以分别指定每个点的大小颜色

import matplotlib.pyplot as plt
from scipy.stats import uniform

rv=uniform(loc=0,scale=1)

x=rv.rvs(size=100)
y=rv.rvs(size=100)

plt.scatter(x,y,s=x*1000,c=y,marker=(5,1))
plt.show()

matplotlib3_4.jpg

按照输入顺序,scatter的输入值分别代表:

  1. 每个点的X坐标
  2. 每个点的Y坐标
  3. s参数指定点的大小(值和点的面积成正比)
  4. c参数指定点的颜色,可以是数值或数据。
    • 如果是数值则自动调用颜色映射表
    • 如果是(N,3)或(N,4)数组,则代表RGB颜色
  5. marker指定形状
    • 第一个元素代表顶点数量
    • 第二个元素代表样式
      • 0多边形
      • 1星形
      • 2放射形
      • 3圆形(忽略边数)

等高图

contour() # 等高线
contourf() # 带填充效果的等高线

示例1

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-2.0, 2.0, 80)
X, Y = np.meshgrid(x, y)
Z = X * np.exp(-X ** 2 - Y ** 2)

fig = plt.figure(1)
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
cs1 = ax1.contour(X, Y, Z, 10)
cs2 = ax2.contourf(X, Y, Z, 10, cmap=cm.PuBu_r)

cbar = fig.colorbar(cs2)  # 在figure上添加cs2对应的颜色条
plt.clabel(cs1)  # 在cs1的等高线上添加数字
plt.show()

matplotlib3_5.png

示例2:隐函数的解

加入levels这个参数,可以画出对应的等高图,依次来画出隐函数的解,
下面的代码是画出$f=(X^2 + Y^2) ** 4 - (X^2 - Y^2) ^2$, 在$f=0,f=0.5$处的解。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1.5, 1.5, 100)
y = np.linspace(-1.5, 1.5, 80)
X, Y = np.meshgrid(x, y)
Z = (X ** 2 + Y ** 2) ** 4 - (X ** 2 - Y ** 2) ** 2

ax = plt.subplot(111)
cs = ax.contour(X, Y, Z, 10, levels=[0, 1], colors=['b', 'r'], linestyles=['-', ':'], linewidths=[2, 2])

plt.clabel(cs)
plt.show()

matplotlib3_6.png

需要注意的是,由于源数据是离散值,所以等高图在某些区域是离散的片段,但实际上应当是连续值。

箭头图

quiver(X,Y,U,V,C)
  • X, Y代表箭头起点的坐标
  • U, V代表箭头对应的向量
  • C代表颜色

示例

import numpy as np
import matplotlib.pyplot as plt


def f(x, y):
    return x * np.exp(-x ** 2 - y ** 2)


def dev_f(f, x, y, dx=1e-6, dy=1e-6):
    v = f(x, y)
    vx = (f(x + dx, y) - v) / dx
    vy = (f(x, y + dy) - v) / dy
    return vx, vy


X, Y = np.meshgrid(np.linspace(-2, 2, 20), np.linspace(-2, 2, 20))
U, V = dev_f(f, X, Y)
C = f(X, Y)

plt.quiver(X, Y, U, V, C)
plt.colorbar()
plt.show()

matplotlib3_7.png


您的支持将鼓励我继续创作!