O Matplotlib é uma ferramenta de desenho muito poderosa em Python. Ao desenhar gráficos de linhas, gráficos de dispersão, gráficos de contorno, gráficos de barras, histogramas, gráficos 3D e até animações gráficas, você pode apresentar cálculos científicos de maneira mais intuitiva. Muitos dados.
1. Elementos básicos
Na estrutura hierárquica do matplotlib, o nível mais alto é o "ambiente de máquina de estado" fornecido pelo módulo matplotlib.pyplot, através do qual elementos de imagem, como curvas, texto, figuras etc. são desenhados para a dimensão atual. A próxima camada é a interface orientada a objetos de primeiro nível.Nesta camada, os usuários podem usar o pyplot para criar e rastrear objetos de imagem e, assim, criar um ou mais sistemas de eixo de dados, usados para desenhar posteriormente .
Os elementos da imagem são os seguintes:
A figura refere-se ao objeto de imagem inteiro, usado para conter um ou mais sistemas de eixos de dados (eixos); se não houver eixos, a imagem estará vazia.
fig = plt.figure() # 创建一个图像对象
fig.suptitle('No axes on this figure') # 添加一个标题
fig, ax_lst = plt.subplots(2, 2) # 创建包含2×2个子图的图像
Aexs é um número complexo de Eixos, traduzido como sistema de eixos e sistema de coordenadas, que pode ser entendido como um sub-gráfico de toda a imagem (Figura), um gráfico pode conter vários sub-gráficos, desenhamos gráficos específicos no sub-gráfico . O objeto de subimagem pode ser criado pela função plt.plot (), o título da subimagem pode ser definido por set_title () e os rótulos das coordenadas horizontal e vertical da figura são definidos por set_xlabel () e set_ylabel ().
Eixo refere-se ao eixo de coordenadas específico, onde o truque representa a escala do eixo de coordenadas, a localização da escala é controlada pelo objeto Location e o Formatter formata a cadeia de caracteres exibida pela escala, e a exibição da escala pode ser controlada com precisão por esses dois objetos.
Objeto Artista: Qualquer elemento da imagem pode ser considerado um Artista, incluindo linhas 2D (Linha), texto e Eixo e Figura, quando a imagem é renderizada, esses objetos são desenhados na imagem. A maioria dos objetos Artist está vinculada a um eixo específico, Axis, e esses objetos não podem ser compartilhados entre sistemas de eixos.
Os dados de entrada do matplot são melhor convertidos para o tipo np.array.O uso de outros tipos de dados como np.matrix, pandas etc. pode relatar erros; portanto, converta os outros tipos através de numpy antes de passar os parâmetros.
As bibliotecas e métodos de codificação necessários sugeridos pelo matplotlib são os seguintes: Ao desenhar, primeiro crie o objeto Figura e o objeto sub-imagem ax através da interface plt e depois chame a função drawing ax através. . Por exemplo, o seguinte define my_plotter () para concluir o desenho da imagem, passando no subgráfico ax, dois dados1, dados2 e parâmetros de desenho da imagem param_dic.
import matplotlib.pyplot as plt # 引入必要的库
import numpy as np
%matplotlib inline
# 定义函数进行图像绘制操作
def my_plotter(ax,data1,data2,param_dic):
ax.plot(x, y,**param_dic)
x = np.arange(0, 10, 0.2) # 准备数据
y = np.sin(x)
fig, ax = plt.subplots(1) # 创建子图
my_plotter(ax,x, y,{ 'linestyle':'dashed','label':'sinx'}) # 调用函数绘制图像
2. Uso básico
Criar imagem e desenhar função
Primeiro, você precisa importar as bibliotecas de funções necessárias matplotlib.pyplot e numpy. Se você usar o jupyternotebook, precisará adicionar a configuração% matplotlib inline para exibir a imagem
Crie uma imagem por plt.figure (), em que o atributo num indica a janela em que a imagem é exibida e o atributo figsize pode especificar o tamanho da imagem
Use plt.plot () para desenhar a curva.Os dois primeiros parâmetros da matriz são os valores das coordenadas da imagem x e y. Após os parâmetros opcionais, você pode definir a cor (linha), largura da linha, estilo (estilo de linha) e opacidade (alfa) da linha
O plt.scatter () desenha um ponto único em vez de uma curva conectada, e os dois primeiros parâmetros são matrizes, correspondentes às coordenadas xey do ponto. O atributo s define o tamanho do ponto, a cor define a cor
Por fim, imprima a imagem através de plt.show ()
import numpy as np
import matplotlib.pyplot as plt
# 设置行内显示
%matplotlib inline
x = np.linspace(-5, 5, 50) # 在-5~5内均匀取50个数
y1 = 2*x + 1 # 定义一个线性函数
y2 = x**2 # 定义一个二次函数
plt.figure(num=3, figsize=(10, 5)) # 创建一个图形对象
plt.plot(x, y2, alpha=0.5) # 绘制曲线
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
plt.scatter([1],[1],s=200,color='orange') # 绘制一个点
plt.show() # 显示图像
Ajuste o eixo
A faixa do eixo de coordenadas x pode ser ajustada através de plt.xlim.Pll.xlabel define o nome do eixo de coordenadas. Da mesma forma, plt.ylim e ylabel definem o eixo y. O chinês não pode ser usado no matlab e o conjunto de caracteres precisa ser definido.
plt.xticks () pode personalizar a escala de coordenadas, passar a escala na forma de uma matriz e pode passar o valor da escala da exibição personalizada
Defina a posição da escala do eixo de coordenadas: obtenha o eixo x pelos eixos object.xaxis e defina a posição pelo método set_ticks_position (), as posições opcionais são: superior, inferior, ambas, padrão, nenhuma, a escala do eixo y correspondente é: esquerda , Certo, ambos, padrão, nenhum
# 设置行内显示
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字符集显示中文
plt.rcParams['axes.unicode_minus'] = False # 设置负号正确显示
x = np.linspace(-5, 5, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure(num=3, figsize=(10, 5))
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
plt.xlabel('x轴') # 设置显示x轴标签
plt.xlim(-2,2) # 设置x轴的范围为-2~2
plt.xticks([-2,-1,0,1,2]) # 设置x轴刻度
axes=plt.gca()
axes.xaxis.set_ticks_position('top') # 设置x坐标显示在上边框
plt.ylabel('y轴')
plt.ylim(-5,5) # 设置y轴的范围为-5~5
plt.yticks([-3,-1,0,1,3],['低','较低','中等','高','较高']) # 自定义刻度值
axes.yaxis.set_ticks_position('left') # 设置y坐标显示在左边框
Também podemos definir as quatro bordas da imagem, obter os eixos dos objetos do eixo através de plt.gca (), obter a borda direita através de .spines ['right'] e, em seguida, set_color para definir sua cor, use set_position () para definir Posição da fronteira
axes.spines['right'].set_color('none') # 获取并设置右边框透明
axes.spines['top'].set_color('none')
axes.spines['bottom'].set_position(('data', 0)) # 将底部边框放到x=0的位置
axes.spines['left'].set_position(('data',0)) # 将左边框放到y=0的位置
3. Legenda e anotação
Ao usar plt.plot () para o desenho da função, você pode adicionar o atributo label para definir o nome da curva.
Use plt.legend () para exibir a legenda na imagem. Seu atributo loc define a posição da legenda. Os valores são 'melhores': 0, 'superior direito': 1, 'superior esquerdo': 2, 'inferior esquerdo': 3, ' inferior direito ': 4,' direito ': 5,' centro esquerdo ': 6,' centro direito ': 7,' centro inferior ': 8,' centro superior ': 9,' centro ': 10, onde é melhor para automático Atribua a melhor posição
plt.plot(x, y1, label='linear')
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square')
plt.legend(loc='upper right')
Você também pode salvar o resultado do plot () como objetos l1, l2 e, em seguida, passar o atributo handle na função legend, para que a função legend possa adicionar uma legenda ao objeto de linha especificado na figura e definir o conteúdo da legenda através do atributo labels.
l1, = plt.plot(x, y1)
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
# 对指定线条对象添加图例
plt.legend(handles=[l1,l2,], labels=['linear','square'], loc='best')
Adicione um comentário à imagem por meio da função plt.annotate (), o primeiro parâmetro é o conteúdo da anotação, o tamanho da anotação da fonte, xycoords representa a posição do ponto de anotação, os dados representam os dados, xy representa os dados recebidos, xycoords = 'pontos de deslocamento' representa a posição da anotação de acordo com o deslocamento de ponto, xytext define o valor de deslocamento, arrowprops é passado no atributo tipo e radiano da seta no ditado
Adicione texto à imagem através de plt.text (), os dois primeiros parâmetros são a posição do texto, o terceiro parâmetro é o conteúdo do texto, fontdict define a fonte e a cor do texto, ha = 'center' define o alinhamento central, va = ' inferior 'definido para o fundo
plt.scatter([1],[1],s=100,color='orange')
# 添加自定义注释
plt.annotate('x²=2x-1',fontsize=20,xycoords='data',xy=(1,1),
textcoords='offset points',xytext=(20,-30),
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
# 添加文本
plt.text(0.5,-1,"This is a text",fontdict={'size':15,'color':'green'},ha='center', va='top')
4. Desenhe a imagem
Gráfico de dispersão
Desenhe um gráfico de dispersão através de scatter (), a propriedade s é o tamanho do ponto, c é a cor do ponto e a opacidade do ponto alfa
n = 1024 # data size
X = np.random.normal(0, 1, n) # 每一个点的X值
Y = np.random.normal(0, 1, n) # 每一个点的Y值
C = np.arctan2(Y,X) # 为每个点生成颜色
plt.scatter(X, Y, s=75, c=C, alpha=0.5)
plt.show()
Gráfico de barras
Use a função plt.bar () para desenhar um gráfico de barras. Os dois primeiros parâmetros são passados para a posição x do histograma e a matriz de valor y A propriedade facecolor define a cor do tema e edgecolor define a cor da borda.
n = 10
X = np.arange(n) # X取1~12
Y1 = np.array([8,9,12,6,5,10,11,13,4,2])
Y2 = np.array([5,6,8,3,14,10,3,2,1,4])
plt.bar(X, Y1, facecolor='blueviolet', edgecolor='orange')
plt.bar(X, -Y2)
# 在柱状图顶部添加文本标注
for x, y in zip(X, Y1):
plt.text(x, y , y, ha='center', va='bottom')
plt.show()
Como mostrado na figura à direita acima, você pode desenhar um histograma da distribuição estatística dos dados por meio de plt.hist (data), e as caixas de parâmetros especificam o intervalo estatístico dividido.
Mapa de contorno
Os dados da linha de contorno são tridimensionais, X e Y são variáveis independentes, Z é o valor da função variável dependente, o mesmo valor é exibido como a linha de contorno de acordo com a diferença do valor da função.
A cor é preenchida pela função plt.contourf (). Os três primeiros parâmetros são os valores X, Y e Z correspondentes, e cmap é a cor do preenchimento. Aqui, é usado um esquema de mapeamento de cores fornecido pelo matlabplot. Mapa grande de azul para vermelho
plt.contour () desenha linhas de contorno, cores = a cor da linha 'preta' é preta, largura da linha = 0,5 largura da linha é 0,5
Desenhar texto através de clabel (), preencher texto em linha
Através da função colorbar (), você pode adicionar um valor de função correspondente à barra de cores na imagem
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y) # 编制为256×256的网格,并把对应的坐标值返回给X、Y数组
def fun(x,y): # 定义函数值Z,是一个三维函数椭圆抛物面
return x**2+y**2
F = plt.contourf(X, Y, fun(X, Y), 8, alpha=.75,cmap='RdBu') # 进行颜色填充
C = plt.contour(X, Y, fun(X, Y), 8, colors='black', linewidth=.5) # 绘制等高线
plt.clabel(C, inline=True, fontsize=10) # 标注文本
plt.colorbar(F) # 添加一个colorbar
plt.show()
Imagem tridimensional
Antes de desenhar gráficos 3D, é necessário introduzir um pacote adicional Axes3D para converter a imagem atual em uma imagem 3D
Da mesma forma, os gráficos 3D requerem dados tridimensionais, X, Y compilado como uma grade é uma variável independente, Z é um valor de função
Desenhe gráficos 3D através de plt.plot_surface (), os atributos rstride e cstride representam o intervalo de linha e coluna, respectivamente, quanto menor o intervalo, mais densa a grade no gráfico e cmap é o esquema de mapeamento de cores do valor da função
A função de desenho de contorno plt.contour () pode ser usada para desenhar uma projeção no plano para gráficos 3D, zdir = 'z' representa a projeção ao longo do eixo Z, de modo que a projeção apareça no plano XY e offset represente a posição de deslocamento da projeção
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D #引入3D绘图库
%matplotlib inline
fig = plt.figure()
ax = Axes3D(fig) # 将当前图像转化为3D
X = np.arange(-10, 10, 0.5)
Y = np.arange(-10, 10, 0.5)
X, Y = np.meshgrid(X, Y) # 编制 X-Y 平面的网格
Z = np.sqrt(X ** 2 + Y ** 2) # Z值,定义为抛物面图形
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hsv') # 绘制3D图
ax.contourf(X, Y, Z, zdir='z', offset=0, cmap='hsv') # 添加沿Z轴方向的投影
plt.show()
Desenhar animação
A animação de desenho requer uma biblioteca de animação adicional do matplotlib
Em seguida, desenhe um dos quadros da imagem primeiro, por exemplo, para desenhar a animação de sinx, pegue o argumento x array em 0 ~ 2Π primeiro e depois desenhe a linha da curva de seu sinx
Em seguida, defina a função de exibição init () do quadro inicial da animação e retorne o objeto de linha inicial. Em seguida, defina a função de exibição de imagem animada de cada quadro, seu parâmetro i representa o i-ésimo quadro e retorne diferentes objetos de linha de acordo com i.
Por fim, desenhe a imagem através da animação.FuncAnimation (), o parâmetro fig é o objeto de imagem criado antes, init_func é a função de exibição de inicialização, func é a função de exibição de cada quadro, intervalo é a frequência de atualização (unidade ms), quadros é o número total de animações Frame, blit para True significa apenas atualizar os pontos alterados a cada vez
Finalmente, o método save () do objeto ani retornado será salvo como um gif, e o escritor usado aqui é imagemagick
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation # 引入动画库
%matplotlib inline
fig,ax=plt.subplots() # 创建画布
x=np.arange(0,2*np.pi,0.01) # 从0~2Π每隔0.01取一个数
line,=ax.plot(x,np.sin(x)) # 绘制sinx的图像
def init(): # 定义初始帧显示函数
line.set_ydata(np.sin(x))
return line,
def animate(i): # 定义每一帧的显示函数
line.set_ydata(np.sin(x+i/10))
return line,
# 绘制动画
ani=animation.FuncAnimation(fig=fig,init_func=init,func=animate,interval=20,frames=100,blit=True)
ani.save('sinx.gif',writer='imagemagick') # 保存动画为gif
plt.show()
5. Várias fotos
Por plt.subplot () pode ser dividida numa pluralidade de sub-gráficos e seleccionar um aí localização, por exemplo subtrama (2,2,1) representativa, 2 x 2 sub-imagem, e em que a primeira sub-gráficos seleccionados podem ser Omita a vírgula do meio: subparcela (224) significa selecionar a quarta das subparcelas 2 × 2. Além de desenhar uma subparcela diretamente através do objeto plt, ela pode retornar um objeto de subtrama e você pode chamar plot () para plotar através do objeto de subtrama.
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure()
# 选中2×2子图中的第一个并画一条线
plt.subplot(2,2,1)
plt.plot([0,1],[2,3])
# 选中2×2子图的第四个画一条线
ax2=plt.subplot(224)
ax2.plt.plot([2,1],[3,4])
plt.show()
Observe que a divisão aqui não é uma divisão de imagem real, mas supõe-se que a imagem inteira seja dividida para localizar a subimagem. Por exemplo, o código a seguir considera primeiro a tela para selecionar o primeiro bloco em 2 linhas e 1 coluna, que é a linha superior, e depois considera o quarto bloco em 2 linhas e 3 colunas, e esse é o primeiro na segunda linha. Subdivisões de diferentes tamanhos e posições podem ser obtidas através de diferentes divisões e seleções. Se houver áreas conflitantes, os subgráficos subseqüentes substituirão os subgráficos anteriores.
# 划分为2行1列,选中第一块
plt.subplot(2,1,1)
plt.plot([0,1],[2,3])
# 划分为2行3列,选中第四块
plt.subplot(234)
plt.plot([2,1],[3,4])
O método subplot2grid () pode ser usado para dividir e selecionar sub-imagens de maneira mais conveniente, como mostrado abaixo subplot2grid ((3, 3), (0, 0), colspan = 3) significa dividir a imagem em áreas 3 × 3, começando na linha 0 A partir da coluna 0, o número de colunas cruzadas horizontalmente na coluna é 3 e o número de linhas cruzadas verticalmente na linha é 1 por padrão.
Observe que os nomes do título e das coordenadas podem ser definidos por title (), xlabel (), ylabel () em uma imagem inteira, mas na subimagem, você precisa adicionar um set_ antes do nome da função
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.plot([1, 2], [1, 2]) # 画小图
ax1.set_title('ax1_title') # 设置小图的标题
ax2 = plt.subplot2grid((3,3), (2,1),colspan=2)
ax2.plot([2,1],[1,0])
ax2.set_xlabel('ax2_x') # 设置小图的坐标轴名
ax2.set_ylabel('ax2_y')
A função gridspec () permite selecionar regiões de submapa tão convenientemente quanto usar matrizes python. Introduza este módulo do matplotlib antes do uso, divida a imagem em regiões pela função Gridspec () e, em seguida, retorne o objeto gs, que pode ser usado para selecionar sub-regiões como uma matriz. Por exemplo, gs [1 ,: 2], antes da vírgula representar a seleção do número de sequência da linha, se houver apenas um número representa a seleção de todas as linhas com um número de sequência 1 e a coluna após a vírgula, aqui 0: 2 representa a seleção de todas as colunas de 0 a 2 antes Coluna, onde 0 pode ser omitido. Da mesma forma, também pode ser omitido se o final do guia estiver selecionado, ou seja, gs [1 ,:]. Se o número de série for -2, significa que o penúltimo está selecionado
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec # 引入库
%matplotlib inline
plt.figure()
gs = gridspec.GridSpec(3, 3) # 将图像划分为3×3个区域
ax1 = plt.subplot(gs[0, :]) # 选中第0行,所有列
ax2 = plt.subplot(gs[-1, -2]) # 选中倒数第1行,倒数第2列
plt.show()
Através de subparcelas (), vários objetos de subgráficos podem ser criados e retornados de uma só vez.Como mostrado abaixo, os quatro sub gráficos são divididos e retornados aos quatro objetos ax11 ~ ax22 em seqüência, e as posições dos quatro objetos não devem ser desordenadas. Entre eles, sharex representa o eixo de coordenadas X de compartilhamento de imagens. plt.tight_layout () significa exibição compacta
f, ((ax11, ax12), (ax21, ax22)) = plt.subplots(2, 2, sharex=True, sharey=True)
ax11.scatter([1,2], [1,2])
plt.tight_layout()
plt.show()
Picture-in-picture: outra imagem pode ser adicionada à imagem através dos add_axes () do objeto de figura. O parâmetro de entrada é a proporção das quatro bordas da tela na qual a imagem está localizada. Retorne o machado do objeto de subimagem criado, use ax para desenhar
x=[0,1]
y=[2,3]
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 创建一个大图对象
ax1.plot(x, y, 'r') # 大图绘制
ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25]) # 创建小图
ax2.plot(x, y, 'b') # 小图绘制
plt.show()
Cópia do subgráfico: A função twinx () do objeto axográfico subgráfico pode copiar outro objeto axial sobreposto com o mesmo eixo x na mesma posição, mas o eixo y é colocado em uma posição simétrica e os dois últimos subgráficos serão exibidos sobrepostos.
fig, ax1 = plt.subplots()
ax2 = ax1.twinx() # 拷贝ax对象
ax1.plot([0,1], [2,3], 'g-') # 在原图中绘制
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g') # 原图的y轴在左侧
ax2.plot([0,1], [3,2], 'b-') # 拷贝对象中绘图
ax2.set_ylabel('Y2 data', color='b') # 拷贝子图的y轴在右侧
plt.show()