Python usa la biblioteca Matplotlib para dibujar gráficos de doble eje y (histograma + gráfico de líneas)

Hoy es la primera vez que escribo una serie de diarios de pasos en el pozo . Esta serie se utiliza para registrar los problemas y resultados encontrados en el proceso de aprendizaje de Python y R. Hoy presentaré algunos usos básicos y comportamiento paso a paso del uso de la biblioteca matplotlib de Python para dibujar dos gráficos del eje y. Espero que pueda ayudarte y espero que puedas dar sugerencias. Bienvenido a dejar un mensaje para intercambiar.

Introducción a Matplotlib

Matplotlib es una herramienta de visualización de uso común en el análisis de datos de Python y también es la base para otras interfaces de dibujo avanzadas (como seaborn, HoloViews, ggplot, etc.) y herramientas de dibujo profesionales (como Cartopy). Matplotlib puede crear gráficos con calidad de publicación, crear gráficos interactivos, personalizar estilos y diseños visuales, exportar a múltiples formatos de archivo e incrustarlos en JupyterLab y GUI. Para obtener más contenido de exploración, consulte el sitio web oficial de Matplotlib o el sitio web chino de Matplotlib .

Instalar

pip install matplotlib

elementos de dibujo

Los siguientes son los componentes de los gráficos de Matplotlib, que provienen del sitio web oficial de Matplotlib. Para un uso detallado, consulte la Guía de inicio rápido - Documentación de Matplotlib 3.7.1 .alternativo

Al configurar el contenido de la etiqueta de texto, como el título o el nombre del eje, si hay caracteres confusos en los caracteres chinos, debe agregar el siguiente código. Si aún no puede resolver el problema, puede intentar cambiar la fuente a otras SimHeifuentes FangSong.

plt.rcParams['font.sans-serif']=['SimHei'] # 用来设置字体样式以正常显示中文标签(黑体)

Si el número es negativo, también puede ser confuso. La solución es:

plt.rcParams['axes.unicode_minus']=False

Matplotlib proporciona una variedad de gráficos, incluidos histogramas básicos, gráficos de líneas, diagramas de dispersión, diagramas de caja, diagramas de dispersión, gráficos circulares, etc., y también proporciona gráficos visuales avanzados como coordenadas polares y gráficos 3D (si no desea Consulte Documentos oficiales, puede consultar un artículo sobre Zhihu para conocer el método básico para dibujar los gráficos anteriores), puede modificar los detalles de la imagen a través de los parámetros anteriores y puede combinar varios gráficos.

Gráfico de doble eje y

Dibuja un gráfico de un solo eje y

import numpy as np  
import matplotlib.pyplot as plt

# 生成一些示例数据
x = np.arange(10)
y = np.random.randint(0,20,10)

# 绘制折线图,设置颜色
plt.plot(x,y,color='blue')
# 设置x轴和y轴的标签,指明坐标含义
plt.xlabel('x轴', fontdict={ 'size': 16})
plt.ylabel('y轴', fontdict={ 'size': 16})
#设置图标题
plt.title('折线图')

# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei']
#展示图片
plt.show()

alternativo
#画柱状图
plt.bar(x,y,color='blue')#只要将以上代码中的`plot`改为`bar`
alternativo

Gráfico de líneas de doble eje y

import numpy as np  
import matplotlib.pyplot as plt

# 生成一些示例数据
x = np.arange(10)
y1 = np.random.randint(10, size=10)
y2 = np.random.randint(10, size=10)

# 创建一个图形和两个y轴
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
#绘制折线图
line1 = ax1.plot(x, y1,label='y1轴', color='royalblue', marker='o', ls='-.')
line2 = ax2.plot(x, y2, label='y2轴', color='tomato', marker=None, ls='--')

# 设置x轴和y轴的标签,指明坐标含义
ax1.set_xlabel('x轴', fontdict={ 'size': 16})
ax1.set_ylabel('y1轴',fontdict={ 'size': 16})
ax2.set_ylabel('y2轴',fontdict={ 'size': 16})
#添加图表题
plt.title('双y轴折线图')
#添加图例
plt.legend()
# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei']
#展示图片
plt.show()
alternativo

Resuelva la leyenda No hay leyenda establecida por el método anterior y1轴y no hay ningún mensaje de error que indique que se muestran ambas leyendas y es muy probable que la y2轴leyenda esté y1轴cubierta por la leyenda. Al mostrar la leyenda de los dos ejes por separado, se demuestra que efectivamente está cubierta

#将`plt.legend()`改为以下代码
ax1.legend(loc='upper right')
ax2.legend(loc='upper left')
alternativo

Pero es demasiado feo mostrar las dos leyendas por separado, todavía espero que se puedan combinar.

lines = line1 + line2  
labels = [h.get_label() for h in lines]
plt.legend(lines, labels, loc='upper right')
alternativo

Configurar el eje parece un poco incómodo al verlo así. Puede verse mejor si el color del eje y la línea son el mismo.

#设置轴标签颜色  
ax1.tick_params('y', colors='royalblue')
ax2.tick_params('y', colors='tomato')
#设置轴颜色
ax1.spines['left'].set_color('royalblue')
ax2.spines['left'].set_color('royalblue')
ax1.spines['right'].set_color('tomato')
ax2.spines['right'].set_color('tomato')
alternativo

El cambio de color de los dos ejes y es realmente mejor, pero el eje superior es un poco brusco, así que elimínelo.

ax1.spines['top'].set_visible(False)  
ax2.spines['top'].set_visible(False)
alternativo

Gráfico de barras + gráfico de líneas

Cambie el y2 de arriba a un histograma y dibuje un histograma y un gráfico lineal con un gráfico de doble eje y

import numpy as np  
import matplotlib.pyplot as plt
# 生成一些示例数据
x = np.arange(10)
y1 = np.random.randint(10, size=10)
y2 = np.random.randint(10, size=10)
# 创建一个图形和两个y轴
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
#绘制图形
bar = ax1.bar(x, y1, label='y1轴', color='tomato', width=0.4)
line = ax2.plot(x, y2,label='y2轴', color='royalblue', marker='o', ls='-.')
# 设置x轴和y轴的标签,指明坐标含义
ax1.set_xlabel('x轴', fontdict={ 'size': 16})
ax1.set_ylabel('y1轴',fontdict={ 'size': 16})
ax2.set_ylabel('y2轴',fontdict={ 'size': 16})
#添加图表题
plt.title('双y轴折线图')
#添加图例
lines = line + bar
labels = [h.get_label() for h in lines]
plt.legend(lines, labels, loc='upper right')
#设置轴标签颜色
ax1.tick_params('y', colors='royalblue')
ax2.tick_params('y', colors='tomato')
#设置轴颜色
ax1.spines['left'].set_color('royalblue')
ax2.spines['left'].set_color('royalblue')
ax1.spines['right'].set_color('tomato')
ax2.spines['right'].set_color('tomato')
#去掉上轴线
ax1.spines['top'].set_visible(False)
ax2.spines['top'].set_visible(False)
# 设置中文显示
plt.rcParams['font.sans-serif']=['SimHei']
#展示图片
plt.show()

Oye, se informó un error. El valor de retorno del histograma matplotlib es un objeto tupla BarContainer, mientras que el valor de retorno del gráfico de líneas es un objeto de lista Line2D.alternativo alternativo

Utilice la función matplotlib.pyplot.plot() para dibujar una polilínea y asignar su valor de retorno a una variable. Tenga en cuenta que la función plot() devuelve una lista que contiene un objeto Line2D, no un objeto Line2D en sí. Por lo tanto, debe agregar una coma después de la variable o especificar el índice de la lista como 0 cuando use el método get_label() para obtener correctamente la etiqueta del objeto Line2D. Entonces #绘制图形 cambie el módulo anterior a

 
#绘制图形
bar = ax1.bar(x, y1, label='y1轴', color='tomato', width=0.4)
line, = ax2.plot(x, y2,label='y2轴', color='royalblue', marker='o', ls='-.')

alternativo

Bueno, ese es el final del diario de hoyos. Para otros detalles de modificación de la imagen, puedes probarlo tú mismo y siempre encontrarás diferentes hoyos si intentas más.

Este artículo está publicado por mdnice multiplataforma.

Supongo que te gusta

Origin blog.csdn.net/XIAOWANGaxs/article/details/131038484
Recomendado
Clasificación