índice
7,2 ls significa estilo de linha (estilo de linha)
7.3 marcador (estilo de marca)
3. Importar imagens (preços de habitação na Califórnia)
Matplotlib é uma biblioteca de plotagem Python baseada em NumPy. É uma ferramenta para visualização de dados em aprendizado de máquina.
Matplotlib tem propriedades de ferramenta fortes, o que significa que é apenas para meu uso, não precisamos gastar muita energia para refiná-lo.
Precisamos apenas saber o que ele pode fazer, quais gráficos podem ser desenhados e uma impressão é o suficiente.
Seja o que for que usarmos no uso real, seremos proficientes quando o usarmos.
Um, o uso comum de Matplotlib
1. Desenhe uma imagem simples
Vamos pegar a função de ativação mais comum no aprendizado de máquina como sigmoid
exemplo, vamos desenhá-la.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10,10,1000)
y = 1 / (1 + np.exp(-x))
plt.plot(x,y)
plt.show()
A fórmula de sigmóide é: O
método plot () exibe a tendência entre as variáveis e o método show () exibe a imagem.
Pegamos a imagem conforme mostrado:
2. Adicione elementos comuns
Adicionamos alguns elementos de referência e a explicação de cada função é detalhada no código.
x = np.linspace(-10,10,1000)
#写入公式
y = 1 / (1 + np.exp(-x))
#x轴范围限制
plt.xlim(-5,5)
#y轴范围限制
plt.ylim(-0.2,1.2)
#x轴添加标签
plt.xlabel("X axis")
#y轴添加标签
plt.ylabel("Y axis")
#标题
plt.title("sigmoid function")
#设置网格,途中红色虚线
plt.grid(linestyle=":", color ="red")
#设置水平参考线
plt.axhline(y=0.5, color="green", linestyle="--", linewidth=2)
#设置垂直参考线
plt.axvline(x=0.0, color="green", linestyle="--", linewidth=2)
#绘制曲线
plt.plot(x,y)
#保存图像
plt.savefig("./sigmoid.png",format='png', dpi=300)
O código acima inclui conteúdo como limitar o intervalo dos eixos X e Y, adicionar títulos e rótulos, definir a grade, adicionar linhas de referência, salvar imagens e assim por diante.
A imagem do desenho é a seguinte:
3. Desenhe curvas múltiplas
#生成均匀分布的1000个数值
x = np.linspace(-10,10,1000)
#写入sigmoid公式
y = 1 / (1 + np.exp(-x))
z = x**2
plt.xlim(-2,2)
plt.ylim(0,1)
#绘制sigmoid
plt.plot(x,y,color='#E0BF1D',linestyle='-', label ="sigmoid")
#绘制y=x*x
plt.plot(x,z,color='purple',linestyle='-.', label = "y=x*x")
#绘制legend,即下图角落的图例
plt.legend(loc="upper left")
#展示
plt.show()
Para desenhar várias imagens, chame vários plot () diretamente.
Nota: Se o método legend () não for chamado, a legenda (legenda ) no canto superior esquerdo não será desenhada . O color
parâmetro suporta representação hexadecimal.
4. Conheça a figura (tela)
Em primeiro lugar, sabemos que figura (tela), como legenda, que mencionamos acima, é a exibição de rótulos de linha.
A linha pontilhada delimitada pela grade é a linha de referência da grade. Rótulos de texto, como Title / x axislabel. Esta imagem nos ajuda a ter uma compreensão intuitiva da figura.
5. Desenhe várias imagens
Uma figura pode corresponder a vários gráficos . Agora, tentamos desenhar várias imagens em uma figura.
x = np.linspace(-2*np.pi, 2*np.pi, 400)
y = np.sin(x**2)
z = 1 / (1 + np.exp(-x))
a = np.random.randint(0,100,400)
b = np.maximum(x,0.1*x)
#创建两行两列的子图像
fig, ax_list = plt.subplots(nrows=2, ncols=2)
# 'r-'其中r表示color=red,-表示linestyle='-'
ax_list[0][0].plot(x,y,'r-')
ax_list[0][0].title.set_text('sin')
ax_list[0][1].scatter(x,a,s=1)
ax_list[0][1].title.set_text('scatter')
ax_list[1][0].plot(x,b,'b-.')
ax_list[1][0].title.set_text('leaky relu')
ax_list[1][1].plot(x,z,'g')
ax_list[1][1].title.set_text('sigmoid')
#调整子图像的布局
fig.subplots_adjust(wspace=0.9,hspace=0.5)
fig.suptitle("Figure graphs",fontsize=16)
plt.show()
Dentre eles, o mais crítico é o subplots
método, que gera subimagens com 2 linhas e 2 colunas, e então chamamos cada método de desenho em ax_list.
Dentre eles 'r-'
, o 'b-.'
parâmetro é a abreviatura de desenho, e os parágrafos seguintes de abreviatura de parâmetro serão explicados separadamente.
6. Desenhe diagramas comuns
Freqüentemente, usamos gráficos para representar a relação entre os dados. Os gráficos comuns incluem histogramas, histogramas, gráficos de pizza, gráficos de dispersão e assim por diante.
# import matplotlib.pyplot as plt
# import numpy as np
# x = np.linspace(-10,10,100)
# y = 1 / (1+np.exp(-x))
# plt.plot(x,y);
# plt.show()
#添加一些参考元素
# import numpy as np
# import matplotlib.pyplot as plt
# x = np.linspace(-10,10,1000)
# y = 1/ (1+np.exp(-x))
# #x轴范围限制
# plt.xlim(-5,5)
# #y轴范围限制
# plt.ylim(-0.2,1.2)
# # x轴添加标签
# plt.xlabel("X axis")
# #y轴添加标签
# plt.ylabel("Y axis")
# #标题
# plt.title("Sigmoid function")
#
# # 设置网格,途中红色虚线
# plt.grid(linestyle = ":",color = "red")
#
# # 设置水平参考线
# plt.axhline(y=0.5,color="green",linestyle="--",linewidth=2)
# #设置垂直参考线
# plt.axvline(x =0.0,color="green",linestyle="--",linewidth=2)
# #绘制曲线
# plt.plot(x,y)
# plt.show()
# #保存图像
# # plt.savefig("./sigmod.png",format="png",dpi=300)
#
#绘制多曲线
# import numpy as np
# import matplotlib.pyplot as plt
# #生成均匀分布的1000个数值
# x = np.linspace(-10,10,1000)
# y = 1/(1+np.exp(-x))
# z = x**2;
# plt.xlim(-2,2)
# plt.ylim(0,1)
# #绘制sigmod
# plt.plot(x,y,color="red",linestyle="-",label="sigmod")
# #绘制y = x**2
# plt.plot(x,z,color="purple",linestyle="-.",label="y=x**2")
# plt.legend(loc="upper left") #左上方角落的图例。
# plt.show()
# 绘制多图像
#一个figure是可以对应多个plot的
# import numpy as np
# import matplotlib.pyplot as plt
# x = np.linspace(-2*np.pi,2*np.pi,400)
# y = np.sin(x**2)
# z = 1/(1+np.exp(-x))
# a = np.random.randint(0,100,400)
# b = np.maximum(x,0.1*x)
# #创建两行两列的子对象
# fig ,ax_list = plt.subplots(nrows =2,ncols =2)
# # r-中r表示color = red. - 表示linestyle ='-'
# ax_list[0][0].plot(x,y,"r-")
# ax_list[0][0].title.set_text("scatter")
#
# ax_list[0][1].scatter(x,a,s=1)
# ax_list[0][1].title.set_text('scatter')
#
# ax_list[1][0].plot(x,b,'b-.')
# ax_list[1][0].title.set_text('leaky relu')
#
# ax_list[1][1].plot(x,z,'g')
# ax_list[1][1].title.set_text('sigmoid')
#
# fig.subplots_adjust(wspace=0.9,hspace=0.5)
# fig.suptitle("Figure graphs",fontsize = 16)
# fig.show()
# plt.show()
#
#
# 绘制常用图
#直方图,柱状图,饼图,散点图等
# 使绘图支持中文
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
#plt.rcParams["font.sans_serif"]=["Microsoft YaHei"]
#创建两行两列的子对象
fig,[[ax1,ax2],[ax3,ax4],[ax5,ax6]]=plt.subplots(nrows=3,ncols=2,figsize=(8,8))
#绘制柱状图
value = (2,3,4,1,2)
index = np.arange(5)
ax1.bar(index,value,alpha = 0.4,color="b")
ax1.set_xlabel("Group")
ax1.set_ylabel("Scores")
ax1.set_title("柱状图")
#绘制直方图
h = 100 + 15*np.random.randn(437)
ax2.hist(h,bins=50)
ax2.title.set_text("直方图")
#绘制饼图pie
labels = "Frogs","CAT","yongji","Logs"
sizes =[15,30,45,10]
explode =(0,0.1,0,0)
ax3.pie(sizes,explode = explode,labels=labels,autopct='%1.1f%%',
shadow = True,startangle = 90)
ax3.axis("equal")
ax3.title.set_text("饼图")
# 绘制棉棒图
x = np.linspace(0.5,2*np.pi,20)
y = np.random.randn(20)
ax4.stem(x,y,linefmt="-",markerfmt ="o",basefmt='-')
ax4.title.set_text("棉棒图")
#绘制气泡图scatter
a = np.random.randn(100)
b = np.random.randn(100)
ax5.scatter(a,b,s=np.power(2*a+4*b,2),c = np.random.rand(100),cmap=plt.cm.RdYlBu,marker='o')
#绘制极线图polar
fig.delaxes(ax6)
ax6 = fig.add_subplot(236,projection='polar')
r = np.arange(0,2,0.01)
theta = 2*np.pi*r
ax6.plot(theta,r)
ax6.set_rmax(2)
ax6.set_rticks([0.5,1,1.5,2])
ax6.set_rlabel_position(-22.5)
ax6.grid(True)
#调整子图像的布局
fig.subplots_adjust(wspace=1,hspace=1.2)
fig.suptitle("图形绘制", fontsize=16)
plt.show()
A imagem do desenho é a seguinte:
7. Abreviação de parâmetro
Como matplotlib suporta abreviações para parâmetros, acho que é necessário falar sobre as abreviações de cada parâmetro separadamente.
x = np.linspace(-10,10,20)
y = 1 / (1 + np.exp(-x))
plt.plot(x,y,c='k',ls='-',lw=5, label ="sigmoid", marker="o", ms=15, mfc='r')
plt.legend()
plt.show()
A imagem do desenho é a seguinte:
7.1 c significa cor
personagem | cor |
---|---|
'b' | azul |
'g' | verde |
'r' | vermelho |
'c' | ciano |
'm' | magenta |
'Y' | amarelo |
'k' | Preto |
'C' | Branco |
7,2 ls significa estilo de linha (estilo de linha)
personagem | Descrição |
---|---|
'-' | estilo de linha sólida |
'-' | estilo de linha tracejada |
'-.' | estilo de linha traço-ponto |
':' | estilo de linha pontilhada |
'.' | marcador de ponto |
',' | marcador de pixel |
'o' | marcador de círculo |
'v' | marcador de triângulo_ para baixo |
'^' | marcador triângulo_up |
'<' | triângulo_esquerdo marcador |
'>' | marcador triângulo_direito |
'1' | marcador tri_down |
'2' | marcador tri_up |
'3' | marcador tri_left |
'4' | marcador tri_right |
's' | marcador quadrado |
'p' | marcador de pentágono |
'*' | marcador de estrela |
'h' | marcador hexagon1 |
'H' | marcador hexágono2 |
'+' | marcador positivo |
'x' | marcador x |
'D' | marcador de diamante |
'd' | marcador de diamante fino |
'|' | marcador vline |
'_' | marcador hline |
7.3 marcador (estilo de marca)
O estilo da marca é mostrado da seguinte forma:
7.4 Outras abreviações
-
lw
Representa a largura da linha (largura da linha) , como: lw = 2,5 -
ms
Representa o tamanho do marcador (tamanho da marca), como: ms = 5 -
mfc
Representa markerfacecolor (cor do marcador), como: mfc = 'red'
2. Uso avançado de Matplotlib
1. Adicionar notas de texto
Podemos adicionar texto, setas e outras anotações na tela (figura) para tornar a apresentação da imagem mais clara e precisa.
Nós desenhamos anotações chamando annotate
métodos .
fig, ax = plt.subplots(figsize=(8, 8))
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
# 绘制一条曲线
line, = ax.plot(t, s)
#添加注释
ax.annotate('figure pixels',
xy=(10, 10), xycoords='figure pixels')
ax.annotate('figure points',
xy=(80, 80), xycoords='figure points')
ax.annotate('figure fraction',
xy=(.025, .975), xycoords='figure fraction',
horizontalalignment='left', verticalalignment='top',
fontsize=20)
#第一个箭头
ax.annotate('point offset from data',
xy=(2, 1), xycoords='data',
xytext=(-15, 25), textcoords='offset points',
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='right', verticalalignment='bottom')
#第二个箭头
ax.annotate('axes fraction',
xy=(3, 1), xycoords='data',
xytext=(0.8, 0.95), textcoords='axes fraction',
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='right', verticalalignment='top')
ax.set(xlim=(-1, 5), ylim=(-3, 5))
A imagem do desenho é a seguinte:
2. Desenho de imagens 3D
Para desenhar uma imagem 3D, você precisa importar a Axes3D
biblioteca.
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
fig = plt.figure(figsize=(15,15))
ax = fig.gca(projection='3d')
# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
# Customize the z axis.
ax.set_zlim(-1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)
O que cmap
significa mapa de cores, usado para desenhar a distribuição de cores, gradiente de cor, etc. cmap
Normalmente colorbar
usado em conjunto para desenhar a barra de cores da imagem.
3. Importar imagens (preços de habitação na Califórnia)
Apresentando mpimg
a biblioteca, para importar imagens.
Vamos tomar os dados de preços de imóveis da Califórnia como exemplo, importar dados de preços de imóveis da Califórnia para desenhar um gráfico de dispersão e importar fotos de mapas da Califórnia para visualizar os dados de preços de imóveis correspondentes à latitude e longitude do mapa. Ao mesmo tempo, use a barra de cores para desenhar a imagem térmica.
código mostrado como abaixo:
import os
import urllib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
#加州房价数据(大家不用在意域名)
housing = pd.read_csv("http://blog.caiyongji.com/assets/housing.csv")
#加州地图
url = "http://blog.caiyongji.com/assets/california.png"
urllib.request.urlretrieve("http://blog.caiyongji.com/assets/california.png", os.path.join("./", "california.png"))
california_img=mpimg.imread(os.path.join("./", "california.png"))
#根据经纬度绘制房价散点图
ax = housing.plot(kind="scatter", x="longitude", y="latitude", figsize=(10,7),
s=housing['population']/100, label="Population",
c="median_house_value", cmap=plt.get_cmap("jet"),
colorbar=False, alpha=0.4,
)
plt.imshow(california_img, extent=[-124.55, -113.80, 32.45, 42.05], alpha=0.5,
cmap=plt.get_cmap("jet"))
plt.ylabel("Latitude", fontsize=14)
plt.xlabel("Longitude", fontsize=14)
prices = housing["median_house_value"]
tick_values = np.linspace(prices.min(), prices.max(), 11)
#颜色栏,热度地图
cbar = plt.colorbar(ticks=tick_values/prices.max())
cbar.ax.set_yticklabels(["$%dk"%(round(v/1000)) for v in tick_values], fontsize=14)
cbar.set_label('Median House Value', fontsize=16)
v
plt.legend(fontsize=16)
A imagem do desenho é a seguinte:
vermelho é caro, azul é barato, o tamanho do círculo indica a população
4. Desenhe linhas de contorno
As linhas de contorno são úteis para desenhar imagens tridimensionais no espaço bidimensional.
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar()
A imagem do desenho é a seguinte:
lugares pretos são picos, lugares vermelhos são vales.
Desenhe animação
A animação do desenho precisa ser importada para a animation
biblioteca e a FuncAnimation
animação do desenho é realizada chamando o método.
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)
# 初始化方法
def init():
line.set_data([], [])
return line,
# 数据更新方法,周期性调用
def animate(i):
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i))
line.set_data(x, y)
return line,
#绘制动画,frames帧数,interval周期行调用animate方法
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=20, blit=True)
anim.save('ccccc.gif', fps=30)
plt.show()
O anim.save()
método no código acima oferece suporte ao salvamento de arquivos no formato mp4.
A imagem animada é desenhada da seguinte forma: