Desenho Python-matplotlib (notas de estudo)

O que é Matplotlib?

Matplotlib é uma biblioteca de plotagem 2D python , que gera gráficos com qualidade de publicação em vários formatos impressos e um ambiente interativo de plataforma cruzada. Com Matplotlib, os desenvolvedores podem gerar gráficos, histogramas, espectros de potência, gráficos de barra, gráficos de erro, gráficos de dispersão, etc. com apenas algumas linhas de código.

Simples de usar
import  matplotlib.pyplot as plt
squares=[1,2,3,4,5]
plt.plot(squares)

plt.show()

Resultados operacionais:
Insira a descrição da imagem aqui
Nota:
1. Se você não usar plo.show (), o gráfico não será exibido, porque você pode ter que descrever o gráfico de várias maneiras, então erros desnecessários podem ser evitados chamando show () explicitamente .

Figura objeto

Vou tirar os objetos um por um aqui e resumi-los mais tarde. Em matplotlib, todo o gráfico é um objeto de figura. Na verdade, cada janela pop-up é um objeto de Figura, então, como criar vários objetos de Figura em um código, ou seja, várias janelas pequenas?
matplotlib.pyplot.figure (num = Nenhum, figsize = Nenhum, dpi = Nenhum, facecolor = Nenhum, edgecolor = Nenhum, frameon = True, FigureClass = <class'matplotlib.figure.Figure '>, clear = False, ** kwargs )
(1) num: Este parâmetro é um parâmetro opcional, ou seja, pode ser fornecido ou não fornecido. O num pode ser entendido como o id do atributo da janela, ou seja, a identidade da janela.
Se este parâmetro não for fornecido, o parâmetro será incrementado quando a janela for criada. Se fornecido, a janela existirá com o num como o Id.
(2) figsize: parâmetro opcional. Tupla inteira, o padrão é nenhum.
Se uma tupla inteira for fornecida, a tupla terá o comprimento e a largura. Se não for fornecida, o padrão é rc fiuguer.figsize.
Por exemplo (4, 4) significa que uma janela é criada com um comprimento de 4 polegadas e uma largura de 4 polegadas.
(3) dpi: Parâmetros opcionais, inteiros. Indica a resolução da janela, caso não seja fornecida, o padrão é figure.dpi
(4) facecolor: parâmetro opcional, que representa a cor de fundo da janela, caso não seja fornecido, o padrão é figure.facecolor
A configuração da cor é através de RGB, e o intervalo é '# 000000' ~ '# FFFFFF', em que 16 bits por 2 bytes representam 0-255 de RGB.
Por exemplo, '# FF0000' significa R: 255 G: 0 B: 0 significa vermelho.
(5) edgecolor: parâmetro opcional, indicando a cor da borda da janela, se não for fornecido, o padrão é figura, edgecolor
(6) frameon: parâmetro opcional, indicando se deve ser desenhada a moldura da janela, o padrão é
(7) figureclass: not yet Understand
(8) clear: parâmetro opcional, o padrão é false, se o parâmetro fornecido for true e a janela existir, o conteúdo da janela será limpo.

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-1,1,100)
y1=x**2
y2=x*2
#这是第一个figure对象,下面的数据都会在第一个figure中显示
plt.figure()
plt.plot(x,y1)
#这里是第二个figure对象,下面的数据都会在第二个figure中显示
plt.figure(num=3,figsize=(10,5))
plt.plot(x,y2,color='red',linewidth='3.0',linestyle='--')
plt.show()

Insira a descrição da imagem aqui
As coisas a serem observadas aqui são:

  • Olhando para a janela de cada imagem acima, podemos ver que a figura não começa de 1 e depois vai para 2. Isso ocorre porque especificamos um parâmetro de num = 3 ao criar o segundo objeto de figura, então a segunda Figura3 exibida no título da janela.
  • Para cada janela, também podemos especificar o tamanho da janela separadamente para elas. Ou seja, o parâmetro figsize.
  • Se quisermos fazer suas linhas diferentes, podemos usar a seguinte instrução para modificar
plt.plot(x,y2,color = 'red',linewidth = 3.0,linestyle = '--')
Uso detalhado de numpy.linspace

numpy.linspace (start, stop, num = 50, endpoint = True, retstep = False, dtype = None)
retorna números uniformemente espaçados dentro do intervalo especificado.
Retorne num samples uniformemente distribuídos em [start, stop].
Os pontos finais deste intervalo podem ser excluídos arbitrariamente.
Saiba mais .

Definir eixo

  • Altere o intervalo dos valores xey exibidos no gráfico
  • Defina um nome para as coordenadas horizontais e verticais
  • Mude o eixo das coordenadas para uma unidade diferente
import matplotlib.pyplot as plt
import numpy as np
import math

x = np.linspace(-1,2,5)#生成-1到2并且个数为5的一组点(以队列的形式)
plt.xticks(x)#以生成的横坐标作为描点
y=2*x
#在对应坐标处更换名称
plt.yticks([-2,-1,0,1,2],['really bad','b','c','d','good'])
plt.xlim(-1,2)#截取0-1的x轴
plt.ylim(-2)#从y=0开始截取y轴
plt.xlabel("x")#设置x轴名称
plt.ylabel("y")
plt.plot(x,y,color="#faf",linewidth=4,linestyle='-')#设置函数线条的颜色,粗细和风格
plt.show()

Executar captura de tela
Insira a descrição da imagem aqui

lenda

Muitas vezes adicionamos várias linhas a uma figura, então como podemos distinguir entre várias linhas? A legenda é usada aqui.
plt.legend (handles = [l1, l2], labels = ['up', 'down'], loc = 'best', shodow = True)
Uma vez que o atributo labels é usado na função legend (), então no plot O rótulo definido na função será inválido. Se os parâmetros definidos nas etiquetas forem menores do que os parâmetros dos handsels, quantos parâmetros nas etiquetas mostrarão quantas informações de função na legenda.
Para o valor de retorno da função de gráfico, se você quiser usar o atributo de manipulação da função de legenda, você deve adicionar um ',' ao valor de retorno da função de gráfico.
loc representa a posição de exibição da legenda. A posição de exibição padrão é 'melhor', o que significa que ela é exibida na imagem da melhor maneira, com o mínimo de funções de oclusão possível.

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0,4,50)
y1=2*x
y2=4*x

# 简单的使用
l1, = plt.plot(x, y1, label='linear line')#注意','很重要
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')

# 简单的设置legend(设置位置)
#方式一
plt.legend(loc='center')#(lower,center,upper)和(left,center,right)之间进行组合,还有特殊的‘center'指位于图中间,'best'表示放在遮住数据最少的位置
#方式二
plt.legend(loc="best",handles =[l1,l2],labels=["line1","line2"],shadow=True)
plt.show()

Executar captura de tela
Insira a descrição da imagem aqui

Adicione algumas anotações na imagem

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y = 2 * x + 1

plt.figure(num=1, figsize=(8, 5))
plt.plot(x, y)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
print("----重新设置x轴和y轴-------")
# 将底下的作为x轴
ax.xaxis.set_ticks_position('bottom')
# 并且data,以x轴的数据为基本
ax.spines['bottom'].set_position(('data', 0))

# 将左边的作为y轴
ax.yaxis.set_ticks_position('left')
# 并且data,以y轴的数据为基本
ax.spines['left'].set_position(('data', 0))

print("------- 注解方式一 -----------")
x0 = 1
y0 = 2 * x0 + 1

plt.plot([x0, x0], [0, y0], "k--", linewidth=2.5, color='red')
plt.plot([0, x0], [y0, y0], 'k--', linewidth=2.5, color='red')
plt.scatter([x0], [y0], s=50, color='b')
plt.annotate(r'$2x+1 = %s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30), textcoords='offset points',
             fontsize=16, arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=.2'))

plt.show()

Nota:

  • xy são as coordenadas horizontal e vertical do ponto a ser anotado;
  • xycoords = 'data' indica que as coordenadas xy do ponto a ser anotado são baseadas nos eixos horizontal e vertical;
  • xytext = (+ 30, -30) e textcoords = 'data' indicam que o texto aqui é baseado no deslocamento da coordenada x do ponto marcado +30 e a coordenada y do ponto marcado -30, que é onde nós quero fazer anotações no texto ;
  • fontsize = 16 significa o tamanho da fonte;
  • arrowprops = dict () Esta é a descrição desta seta, arrowstyle = '->' este é o tipo de seta, connectionstyle = "arc3, ​​rad = .2" estes dois descrevem o arco e o ângulo da nossa seta.
    A primeira maneira de adicionar tags
    Insira a descrição da imagem aqui
plt.annotate(r'$2x+1 = %s$'% y0,xy = (x0,y0),xycoords = 'data',
             xytext=(+30,-30),textcoords = 'offset points',fontsize = 16
             ,arrowprops = dict(arrowstyle='->',
                                connectionstyle="arc3,rad=.2"))

A segunda maneira de adicionar tags
Insira a descrição da imagem aqui

print("-----方式二-----")
plt.text(-3.7,3,r'$this\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
         fontdict={
    
    'size':16,'color':'r'})

Tipos de desenho

gráfico de dispersão
import matplotlib.pyplot as plt
import numpy as np

# 数据个数
n = 24

# 用np.random.normal生成随机数,返回 列表。其中参数为 平均数是0,方差是1,生成n个数
X = np.random.normal(0, 1, n)
# 用np.random.normal生成随机数,返回 列表。其中参数为 平均数是0,方差是1,生成n个数
Y = np.random.normal(0, 1, n)


# T代表点的颜色
T = np.arctan2(Y, X)  # for color value
np.arctan2(X, Y)

plt.scatter(X,Y,s=75,c=T,alpha=0.5)

# plt.scatter(np.arange(5), np.arange(5))
# plt.xlim(-1.5,1.5)
# plt.ylim(-1.5,1.5)

# 将x轴y轴的下标设为空
plt.xticks([])
plt.yticks(())

plt.show()

Insira a descrição da imagem aqui

Histograma
import matplotlib.pyplot as plt
import numpy as np

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, Y1, 0.6, None, facecolor="#9999ff", edgecolor='white')
plt.bar(X, -Y2, 0.6, None, facecolor='#ff9999', edgecolor='white')
# ha:horizontal alignment  水平对齐
# va:Vertical alignment 垂直对齐
for x, y in zip(X, Y1):
    plt.text(x, y + 0.01, '%.2f' % y, ha='center', va='bottom', fontdict={'size': 10, 'color': "red"})
for x, y in zip(X, Y2):
    plt.text(x, -y - 0.01, '%.2f' % y, ha='center', va='top')

plt.show()

Insira a descrição da imagem aqui

Mapa de contorno de contornos
import matplotlib.pyplot as plt
import numpy as np
def f(x, y):
    # 计算高度的函数
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)

# 把x,y绑定成网格的输入值
X, Y = np.meshgrid(x, y)
# 把颜色放入等高线内
plt.contourf(X, Y, f(X, Y), 8, alpha=0.75, cmap=plt.cm.hot)

# 画等高线的线
C = plt.contour(X, Y, f(X, Y), 8, alpha=1, colors='green', linewidths=0.5)

# 给等高线加上label描述
plt.clabel(C, inline=True, fontsize=10, colors='black')
plt.show()

Insira a descrição da imagem aqui

imagem
import matplotlib.pyplot as plt
import numpy as np
import random

list1 = []
for i in range(9):
    list1.append(random.random())

print(list1)
print(type(list1))

list1 = np.random.normal(0, 1, 9)
print(type(list1))
# a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
#               0.365348418405, 0.439599930621, 0.525083754405,
#               0.423733120134, 0.525083754405, 0.651536351379]).reshape(3, 3)
a = np.array(list1).reshape(3, 3)
print(a)
print(type(a))
plt.imshow(a, interpolation='nearest', cmap='bone', origin='upper')
# 显示colorbar,shrink表示压缩为图片的长的多少
plt.colorbar(shrink=0.7)
plt.xticks(())
plt.yticks(())
plt.show()

Insira a descrição da imagem aqui
Saiba mais sobre cmap .

Dados 3D
import matplotlib.pyplot as plt
import numpy as np
# 画3D图必须引入的包
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()

ax = Axes3D(fig)
# 取得X,Y的值
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)

Z = np.cos(R)
# 画出3D图,rstride表示横坐标跨度,cstride表示纵坐标跨度
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))

ax.contourf(X, Y, Z, zdir='z', offset=2, cmap='rainbow')

ax.set_zlim3d(-2, 2)
plt.show()

Insira a descrição da imagem aqui

Tela combinada de várias imagens

Use a função subplot

Visor tudo-em-um

import matplotlib.pyplot as plt
import numpy as np

plt.figure()

plt.subplot(2, 1, 1)
plt.plot([0, 1], [0, 1])
# ax=plt.gca()
# #右边的脊梁
# ax.spines['right'].set_color('none')
# ax.spines['top'].set_color('none')
# print("----重新设置x轴和y轴-------")
# # 将底下的作为x轴
# ax.xaxis.set_ticks_position('bottom')
# # 以y轴的数据为基本,设置‘bottom’脊梁的位置
# ax.spines['bottom'].set_position(('data', 0.5))#axes定义百分比位置
#
# # 将左边的作为y轴
# ax.yaxis.set_ticks_position('left')
# # 以x轴的数据为基本,设置‘left’脊梁的位置
# ax.spines['left'].set_position(('data', 0.5))


plt.subplot(2, 3, 4)
plt.plot([0, 1], [0, 2])

plt.subplot(2, 3, 5)
plt.plot([0, 1], [0, 1])

plt.subplot(2, 3, 6)
plt.plot([0, 4], [0, 4])
plt.show()

Insira a descrição da imagem aqui
Exibição separada por subtrama

import matplotlib.pyplot as plt
import numpy as np
#第二种分隔显示需要导入的模块
import matplotlib.gridspec as gridspec

#方法一:subplot2.grid
plt.figure()
ax1=plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)
ax1.plot([1,2],[1,2])
#ax1.set_title()==plt.title()类似的都用set_
ax1.set_title('ax1_title')
ax2=plt.subplot2grid((3,3),(1,0),colspan=2)
ax3=plt.subplot2grid((3,3),(1,2),rowspan=2)
ax4=plt.subplot2grid((3,3),(2,0))
ax5=plt.subplot2grid((3,3),(2,1))

#方法二:gridspec
plt.figure()
gs=gridspec.GridSpec(3,3)
ax1=plt.subplot(gs[0,:])
ax2=plt.subplot(gs[1,:2])
ax3=plt.subplot(gs[1:,2])
ax4=plt.subplot(gs[-1,0])
ax5=plt.subplot(gs[-1,-2])

#方法三:easy to define structure

f, ((ax11, ax12), (ax21, ax22)) = plt.subplots(2, 2, sharex=True, sharey=True)
ax11.scatter([1,2],[1,2])
plt.tight_layout()
plt.show()

Insira a descrição da imagem aqui
Figura figura

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]
left, bottom, width, height = 0.15, 0.1, 0.8, 0.8
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')

left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(y, x, 'g')

plt.axes([.6, .2, .25, .25])
# y[::-1]将y中数据进行逆序
plt.plot(y[::-1], x, 'b')

plt.show()

Insira a descrição da imagem aqui
Eixo secundário

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.1)
y1 = 0.05 * x ** 2

y2 = -1 * y1
fg, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b-')

ax1.set_xlabel("X data")
ax1.set_ylabel("Y1", color='g')

ax2.set_ylabel("Y2", color='b')

plt.show()

Insira a descrição da imagem aqui
animação

import matplotlib.pyplot as plt
import numpy as np
# 动画需要导入的模块
from matplotlib import animation

fig, ax = plt.subplots()

x = np.arange(0, 2 * np.pi, 0.01)
line, = ax.plot(x, np.sin(x))


def animation1(i):
    global line
    line.set_ydata(np.sin(x + i / 150 * np.pi * 2))
    return line


def init1():
    line.set_ydata(np.sin(x))
    return line,


ani = animation.FuncAnimation(fig=fig, func=animation1, frames=150, init_func=init1, interval=20, blit=False)

plt.show()

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/qq_44788518/article/details/108922841
Recomendado
Clasificación