Usando Matplotlib para desenhar gráficos comuns em Python

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

 

Publicado 124 artigos originais · Gosto 65 · Visite mais de 130.000

Acho que você gosta

Origin blog.csdn.net/theVicTory/article/details/104571096
Recomendado
Clasificación