Colores, marcadores y estilos de línea

Básico
Matplotlib
Matplotlib
Actualizado: 18/04/2026

Especificación de colores en Matplotlib

La personalización visual es una de las fortalezas de Matplotlib. Colores, marcadores y estilos de línea permiten transformar un gráfico genérico en una visualización clara, distinguible y profesional. Dominar estas opciones es fundamental para comunicar datos de forma efectiva.

Formas de especificar colores

Matplotlib acepta colores en múltiples formatos. El más habitual es el nombre CSS ('royalblue', 'tomato'), pero también se pueden usar códigos hexadecimales, tuplas RGB/RGBA normalizadas entre 0 y 1, valores de escala de grises e incluso el ciclo por defecto con la notación 'C0', 'C1', etc.

Cuando se trabaja con colores RGBA, el cuarto componente controla la transparencia (alpha): 0 es completamente transparente y 1 es completamente opaco.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 100)

fig, axes = plt.subplots(2, 3, figsize=(14, 8))

# Por nombre de color CSS
axes[0, 0].plot(x, np.sin(x), color='royalblue', linewidth=2)
axes[0, 0].set_title("color='royalblue' (nombre)")

# Código hexadecimal
axes[0, 1].plot(x, np.sin(x), color='#E74C3C', linewidth=2)
axes[0, 1].set_title("color='#E74C3C' (hex)")

# Tupla RGB (valores 0-1)
axes[0, 2].plot(x, np.sin(x), color=(0.2, 0.7, 0.3), linewidth=2)
axes[0, 2].set_title("color=(0.2, 0.7, 0.3) (RGB)")

# Tupla RGBA (con transparencia)
axes[1, 0].plot(x, np.sin(x), color=(0.5, 0.1, 0.9, 0.6), linewidth=3)
axes[1, 0].set_title("color=(R, G, B, A) (RGBA)")

# Escala de grises (cadena de 0.0 a 1.0)
axes[1, 1].plot(x, np.sin(x), color='0.5', linewidth=2)
axes[1, 1].set_title("color='0.5' (gris 50%)")

# Ciclo de colores por defecto con 'C0', 'C1', etc.
for i in range(4):
    axes[1, 2].plot(x, np.sin(x + i * 0.5), color=f'C{i}',
                    linewidth=2, label=f'C{i}')
axes[1, 2].legend(fontsize=8)
axes[1, 2].set_title("'C0', 'C1', ... (ciclo por defecto)")

for ax in axes.flat:
    ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

Marcadores en Matplotlib

Marcadores disponibles

Los marcadores son los símbolos que representan cada punto de datos en un gráfico de líneas o de dispersión. Matplotlib ofrece más de una docena de marcadores predefinidos. En el siguiente ejemplo se muestran los más utilizados con su carácter identificador:

import matplotlib.pyplot as plt
import numpy as np

marcadores_comunes = {
    'o': 'Círculo',
    's': 'Cuadrado',
    '^': 'Triángulo ↑',
    'v': 'Triángulo ↓',
    'D': 'Diamante',
    '*': 'Estrella',
    '+': 'Cruz +',
    'x': 'Cruz ×',
    'p': 'Pentágono',
    'h': 'Hexágono',
    '.': 'Punto',
    ',': 'Pixel',
}

x_vals = np.arange(len(marcadores_comunes))
y_vals = np.ones(len(marcadores_comunes))

fig, ax = plt.subplots(figsize=(14, 4))
for i, (marker, nombre) in enumerate(marcadores_comunes.items()):
    ax.plot(i, 1, marker=marker, markersize=14, color='royalblue', linestyle='none')
    ax.text(i, 0.85, f"'{marker}'\n{nombre}", ha='center', fontsize=8, color='gray')

ax.set_xlim(-0.5, len(marcadores_comunes) - 0.5)
ax.set_ylim(0.7, 1.2)
ax.axis('off')
ax.set_title('Marcadores disponibles en Matplotlib', fontsize=13)
plt.tight_layout()
plt.show()

El parámetro markevery resulta especialmente útil cuando se trabaja con series de muchos puntos: permite mostrar el marcador solo en cada N puntos, evitando que el gráfico quede saturado.

Combinación de estilos visuales

Combinar color, marcador y estilo de línea

Una de las técnicas más habituales para distinguir varias series en un mismo gráfico es asignar a cada una un color, un estilo de línea y un marcador distintos. Esta triple codificación visual hace que el gráfico sea legible incluso en impresión monocromática:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 4 * np.pi, 60)

fig, ax = plt.subplots(figsize=(12, 6))

series = [
    {'color': '#4E79A7', 'linestyle': '-',  'marker': 'o', 'label': 'Serie A'},
    {'color': '#F28E2B', 'linestyle': '--', 'marker': 's', 'label': 'Serie B'},
    {'color': '#59A14F', 'linestyle': ':',  'marker': '^', 'label': 'Serie C'},
    {'color': '#E15759', 'linestyle': '-.', 'marker': 'D', 'label': 'Serie D'},
]

for i, props in enumerate(series):
    y = np.sin(x + i * np.pi / 4) * (1 - i * 0.1)
    ax.plot(x, y, linewidth=2, markersize=6, markevery=5, **props)

ax.set_title('Múltiples series con combinación de estilos visuales', fontsize=13)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='upper right')
ax.grid(True, linestyle='--', alpha=0.4)
plt.tight_layout()
plt.show()

prop_cycle: ciclo de propiedades personalizado

Cuando un gráfico contiene muchas series, definir manualmente cada combinación de color y estilo se vuelve tedioso. El prop_cycle permite establecer un ciclo de propiedades que Matplotlib aplica automáticamente a cada llamada sucesiva a plot(). Se define mediante la clase cycler del módulo matplotlib.cycler:

El prop_cycle se aplica de forma cíclica: si hay más series que combinaciones definidas, el ciclo vuelve a empezar desde la primera.

import matplotlib.pyplot as plt
from matplotlib.cycler import cycler
import numpy as np

# Definir un ciclo personalizado de colores y estilos de línea
ciclo_personalizado = cycler(
    color=['#4E79A7', '#F28E2B', '#59A14F', '#E15759'],
    linestyle=['-', '--', ':', '-.'],
    linewidth=[2, 2, 2, 2]
)

fig, ax = plt.subplots(figsize=(11, 5))
ax.set_prop_cycle(ciclo_personalizado)

x = np.linspace(0, 10, 100)
for i in range(4):
    ax.plot(x, np.sin(x + i * np.pi / 4), label=f'Serie {i+1}')

ax.set_title('prop_cycle: ciclo de propiedades personalizado')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Accesibilidad visual

Colores accesibles para daltonismo

Aproximadamente un 8% de los hombres y un 0,5% de las mujeres presentan algún tipo de daltonismo. Elegir una paleta de colores que funcione para todas las personas es una práctica profesional imprescindible. Las paletas más seguras son las cualitativas de Tableau y las secuenciales perceptualmente uniformes como viridis, cividis o inferno.

La combinación rojo-verde es la más problemática. Utiliza azul-naranja o azul-rojo como alternativa segura. Complementa el color con variaciones en el estilo de línea o marcador para reforzar la distinción.

import matplotlib.pyplot as plt
import numpy as np

# Paleta Tableau colorblind-safe (tab10 con los primeros colores)
colores_seguros = ['#0173b2', '#de8f05', '#029e73', '#d55e00', '#cc78bc']

x = np.linspace(0, 8, 100)
fig, ax = plt.subplots(figsize=(10, 5))

for i, color in enumerate(colores_seguros):
    ax.plot(x, np.sin(x + i * 0.7), color=color, linewidth=2.5,
            label=f'Grupo {chr(65+i)}')

ax.set_title('Paleta de colores accesible para daltonismo', fontsize=13)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Matplotlib es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Matplotlib

Explora más contenido relacionado con Matplotlib y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Especificar colores con nombres, hex, RGB, RGBA y colormaps. Usar los diferentes marcadores disponibles en Matplotlib. Combinar estilos de línea, grosores y marcadores en la misma serie. Crear ciclos de propiedades personalizados con prop_cycle. Elegir colores accesibles para personas con daltonismo.