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:
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()
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
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
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
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
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()