Matplotlib funciones de trazado avanzadas


Matplotlib 参考文档Matplotlib documentación de referencia

Además de funciones de trazado básicas como plot() y bar(), Matplotlib también proporciona varias funciones de trazado especializadas para escenarios como gráficos de escalera, gráficos de tallo y hojas, gráficos de áreas apiladas, gráficos polares, etc.

Lista de funciones

FunciónDescripción
step()Dibuja un gráfico de escalera (cambios constantes por segmentos de datos)
stem()Dibuja un gráfico de tallo y hojas (línea vertical + marcador en el extremo)
eventplot()Dibuja un gráfico de eventos (múltiples líneas horizontales marcan posiciones de eventos)
stackplot()Dibuja un gráfico de áreas apiladas
broken_barh()Dibuja un gráfico de barras discontinuas horizontal (estilo diagrama de Gantt)
vlines() / hlines()Dibuja múltiples líneas de referencia verticales/horizontales
fill()Dibuja polígonos rellenos
polar()Dibuja en sistema de coordenadas polares
loglog() / semilogx() / semilogy()Gráfico de líneas con escala logarítmica
grouped_bar()Gráfico de barras agrupadas (nuevo en 3.10+)
bar_label() / pie_label()Añade etiquetas de valor a gráficos de barras/tartas

step() - Gráfico de escalera

matplotlib.pyplot.step(x, y, *args, where='pre', **kwargs)
ParámetroDescripción
x, yCoordenadas de puntos de datos
wherePosición del escalón: 'pre' (antes), 'post' (después), 'mid' (medio)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.5)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')

# Comparar los tres modos de where
ax.plot(x, y, 'gray', alpha=0.3, label='Original (plot)')
ax.step(x, y, where='pre', label='where="pre"', linewidth=2)
ax.step(x, y, where='post', label='where="post"', linewidth=2)
ax.step(x, y, where='mid', label='where="mid"', linewidth=2)

ax.set_title('step() - Staircase Plot')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()

stem() - Gráfico de tallo y hojas

matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None,
    basefmt=None, bottom=0, orientation='vertical', **kwargs)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

n = 30
x = np.arange(n)
y = np.random.randn(n) * 2

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4),
                                 layout='constrained')

# Gráfico de tallo y hojas vertical
ax1.stem(x, y, linefmt='steelblue', markerfmt='o',
         basefmt='gray')
ax1.set_title('Vertical stem()')

# Gráfico de tallo y hojas horizontal
ax2.stem(x, y, linefmt='coral', markerfmt='s',
         basefmt='gray', orientation='horizontal')
ax2.set_title('Horizontal stem()')

plt.show()

stackplot() - Gráfico de áreas apiladas

matplotlib.pyplot.stackplot(x, *args, labels=None, colors=None,
    baseline='zero', **kwargs)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.1)
y1 = np.sin(x) + 2
y2 = np.cos(x) + 2
y3 = 0.5 * np.sin(2*x) + 2

fig, ax = plt.subplots(figsize=(8, 5), layout='constrained')

ax.stackplot(x, y1, y2, y3,
             labels=['Signal 1', 'Signal 2', 'Signal 3'],
             colors=['#3498db', '#e74c3c', '#2E7DCC'],
             alpha=0.7)

ax.set_title('stackplot() - Stacked Area Chart')
ax.legend(loc='upper right')
plt.show()

vlines() / hlines() - Líneas de referencia

matplotlib.pyplot.vlines(x, ymin, ymax, colors=None, **kwargs)
matplotlib.pyplot.hlines(y, xmin, xmax, colors=None, **kwargs)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')
ax.plot(x, y, 'k-', linewidth=2, alpha=0.7)

# Múltiples líneas verticales (marcar múltiplos de π)
pi_x = [np.pi, 2*np.pi, 3*np.pi]
ax.vlines(pi_x, ymin=-1.5, ymax=1.5,
          colors='red', linestyles='--', alpha=0.5,
          label='π multiples')

# Múltiples líneas horizontales (marcar ±1)
ax.hlines([-1, 0, 1], xmin=0, xmax=10,
          colors=['gray','gray','gray'],
          linestyles=['--',':','--'], alpha=0.5)

ax.set_title('vlines() and hlines()')
ax.legend()
plt.show()

loglog() / semilogx() / semilogy() - Escala logarítmica

matplotlib.pyplot.loglog(*args, **kwargs)
matplotlib.pyplot.semilogx(*args, **kwargs)
matplotlib.pyplot.semilogy(*args, **kwargs)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(0, 3, 50)      # 10^0 a 10^3
y1 = x**2
y2 = x**1.5
y3 = np.exp(x/50)

fig, axes = plt.subplots(1, 3, figsize=(12, 4),
                          layout='constrained')

# Doble logarítmica
axes[0].loglog(x, y1, 'b-', label='x²')
axes[0].loglog(x, y2, 'r--', label='x¹·⁵')
axes[0].set_title('loglog()')
axes[0].grid(True, alpha=0.3)
axes[0].legend()

# Eje x logarítmico
axes[1].semilogx(x, y3, 'green', label='exp(x/50)')
axes[1].set_title('semilogx()')
axes[1].grid(True, alpha=0.3)

# Eje y logarítmico
axes[2].semilogy(x, y3, 'purple', label='exp(x/50)')
axes[2].set_title('semilogy()')
axes[2].grid(True, alpha=0.3)

plt.show()

eventplot() - Gráfico de eventos

matplotlib.pyplot.eventplot(positions, orientation='horizontal',
    lineoffsets=1, linelengths=1, linewidths=None, colors=None, **kwargs)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

# Tiempos de evento de tres canales
events_A = np.random.rand(20) * 10
events_B = np.random.rand(15) * 10
events_C = np.random.rand(25) * 10

fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')

ax.eventplot([events_A, events_B, events_C],
             colors=['#e74c3c', '#3498db', '#2E7DCC'],
             lineoffsets=[0, 1, 2],    # Posición vertical de cada línea
             linelengths=0.8,
             linewidths=1.5)

ax.set_title('eventplot() - Event Timing Diagram')
ax.set_xlabel('Time (s)')
ax.set_yticks([0, 1, 2])
ax.set_yticklabels(['Channel A', 'Channel B', 'Channel C'])
plt.show()

broken_barh() - Gráfico de barras discontinuas

matplotlib.pyplot.broken_barh(xranges, yrange, **kwargs)

Ejemplo

import matplotlib.pyplot as plt

# Simular un diagrama de Gantt
tasks = [
    [(0, 5)],                   # Tarea 1: comienza en 0, dura 5
    [(3, 4)],                   # Tarea 2: comienza en 3, dura 4
    [(2, 3), (6, 3)],          # Tarea 3: dos períodos de tiempo
    [(5, 4)],                   # Task 4
    [(1, 2), (4, 2), (8, 2)],  # Tarea 5: tres períodos de tiempo
]

fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')

colors = ['#3498db', '#e74c3c', '#2E7DCC', '#f39c12', '#9b59b6']
for i, (task, color) in enumerate(zip(tasks, colors)):
    ax.broken_barh(task, (i - 0.4, 0.8), facecolors=color)

ax.set_title('broken_barh() - Gantt-style Chart')
ax.set_xlabel('Time')
ax.set_yticks(range(5))
ax.set_yticklabels([f'Task {i+1}' for i in range(5)])
ax.grid(True, alpha=0.3)
plt.show()

fill() - Rellenar polígono

matplotlib.pyplot.fill(*args, **kwargs)

Ejemplo

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(layout='constrained')

# Rellenar un rombo
x = [1, 2, 1, 0]
y = [0, 1, 2, 1]
ax.fill(x, y, alpha=0.5, color='steelblue',
        edgecolor='black', label='Diamond')

# Rellenar un pentágono
theta = np.linspace(0, 2*np.pi, 6)
x2 = 2.5 + np.cos(theta)
y2 = 1 + np.sin(theta)
ax.fill(x2, y2, alpha=0.5, color='coral',
        edgecolor='black', label='Pentagon')

ax.set_title('fill() - Filled Polygons')
ax.set_aspect('equal')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()

Matplotlib 参考文档Matplotlib documentación de referencia

Otras extensiones