Gráfico de Lineas

Python
code
Visualization
Author

Marco Aguirre

Published

September 3, 2025

Un gráfico de líneas muestra la evolución de una o varias variables numéricas a lo largo del tiempo u otro eje ordenado. Los puntos de datos se conectan mediante segmentos rectos, lo que facilita identificar tendencias, picos y caídas.

0.1 ¿Cuándo usarlo?

  • Series temporales (ejemplo: temperatura diaria, ventas mensuales, número de usuarios por semana).
  • Comparar la evolución de varias categorías, siempre que no haya demasiadas líneas.
  • Detectar patrones, ciclos o cambios significativos en el tiempo.

0.2 Características clave

  • Eje X: variable ordenada (generalmente el tiempo).
  • Eje Y: magnitudes numéricas.
  • Los datos están ordenados y unidos por líneas, a diferencia del gráfico de dispersión donde los puntos aparecen aislados.
  • Puede incluir una zona de confianza alrededor de la línea cuando se trabaja con valores promediados.

0.3 Errores a evitar

  • Cortar el eje Y sin justificación: exagera o minimiza cambios.
  • Usar doble eje Y: confunde al lector.
  • Gráfico espagueti: demasiadas líneas hacen ilegible el gráfico.

1 Dataset: Precios Agroindustria de Cacao (2012 - 2025)

Archivo: MAG_PreciosAgroindustriaCacao_2025Junio.csv
Fuente: Ministerio de Agricultura y Ganadería (MAG), Ecuador
Última actualización: Junio 2025

import pandas as pd
df = pd.read_csv("mag_preciosagroindustriacacao_2025junio.csv", sep=";")
print(df.head())
print(df.info())
   PACC_ANIO PACC_MES DPA_PROVINCIA DPA_CANTON        PACC_PRODUCTO  \
0       2012    Enero        El Oro  Arenillas  Cacao seco mezclado   
1       2012    Enero        El Oro  Arenillas  Cacao seco mezclado   
2       2012    Enero        El Oro   El Guabo  Cacao seco mezclado   
3       2012    Enero        El Oro   El Guabo  Cacao seco mezclado   
4       2012    Enero        El Oro    Machala  Cacao seco mezclado   

          PACC_PRESENTACION PACC_TIPO  PACC_PRECIO_USD  PACC_USD_KG  
0  Quintal de 100,00 libras    Compra            71.41         1.57  
1  Quintal de 100,00 libras     Venta            74.06         1.63  
2  Quintal de 100,00 libras    Compra            73.75         1.63  
3  Quintal de 100,00 libras     Venta            84.00         1.85  
4  Quintal de 100,00 libras    Compra            75.00         1.65  
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26246 entries, 0 to 26245
Data columns (total 9 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   PACC_ANIO          26246 non-null  int64  
 1   PACC_MES           26246 non-null  object 
 2   DPA_PROVINCIA      26246 non-null  object 
 3   DPA_CANTON         26246 non-null  object 
 4   PACC_PRODUCTO      26246 non-null  object 
 5   PACC_PRESENTACION  26246 non-null  object 
 6   PACC_TIPO          26246 non-null  object 
 7   PACC_PRECIO_USD    26246 non-null  float64
 8   PACC_USD_KG        26246 non-null  float64
dtypes: float64(2), int64(1), object(6)
memory usage: 1.8+ MB
None

import plotly.express as px
import plotly.io as pio
pio.renderers.default = "notebook"
import plotly.express as px

# Agrupa el DataFrame por año, calculando el precio promedio
df_avg_anio = df.groupby(["PACC_ANIO"], as_index=False)["PACC_PRECIO_USD"].mean()

# Gráfico de líneas sencillo con grilla y ejes automáticos
fig = px.line(
    df_avg_anio,
    x="PACC_ANIO",                # Eje X: año
    y="PACC_PRECIO_USD",          # Eje Y: precio promedio USD
    markers=True,                 # Muestra los puntos de cada año
    title="Evolución del precio promedio (USD) por año",
    labels={"PACC_ANIO": "Año", "PACC_PRECIO_USD": "Precio USD"}
)

fig.show()

# Obtiene todos los años únicos presentes en el DataFrame original
all_years = sorted(df["PACC_ANIO"].unique())

# Gráfico de líneas con fondo blanco, sin grilla, línea verde y anotación en el último punto (2025)
fig = px.line(
    df_avg_anio,
    x="PACC_ANIO",
    y="PACC_PRECIO_USD",
    markers=True,
   title=' <span style="color:#43B099;">TENDENCIAS DEL PRECIO DEL CAFE, CON EL MEJOR PRECIO </span>'
          '<span style="color:red;">2025</span>',
    labels={"PACC_ANIO": "Año", "PACC_PRECIO_USD": "Precio USD"},
    line_shape="linear",
    category_orders={"PACC_ANIO": all_years},
    # text="PACC_ANIO"
)

# Cambia el color de la línea a verde
fig.update_traces(line=dict(color="#43B099"), marker=dict(color="#43B099"))
#fig.update_traces(textposition="bottom right")
# Fondo blanco y sin grilla
fig.update_layout(
    plot_bgcolor="white",
    paper_bgcolor="white",
    xaxis=dict(showgrid=False, showline=True, linecolor="black", title="Año"),
    yaxis=dict(showgrid=False, showline=True, linecolor="black", title="Precio USD"),
    font=dict(family="Arial", size=14, color="black"),
    title=dict(font=dict(size=22, family="Arial", color="darkblue"), x=0.5, xanchor="center"),
    margin=dict(l=40, r=40, t=80, b=40)
)

# Escribe el valor del último punto (2025)
ultimo_anio = df_avg_anio["PACC_ANIO"].max()
ultimo_valor = df_avg_anio[df_avg_anio["PACC_ANIO"] == ultimo_anio]["PACC_PRECIO_USD"].values[0]
fig.add_annotation(
    x=ultimo_anio,
    y=ultimo_valor,
    text=f"${ultimo_valor:.2f}",
    showarrow=True,
    arrowhead=2,
    font=dict(color="red", size=16),
    bgcolor="white"
)

fig.show()
import plotly.express as px  # Importa la librería Plotly Express para gráficos interactivos

# Agrupa el DataFrame por año y tipo, calculando el precio promedio
df_avg_tipo_anio = df.groupby(["PACC_ANIO", "PACC_TIPO"], as_index=False)["PACC_PRECIO_USD"].mean()

# Obtiene todos los años únicos presentes en el DataFrame original
all_years = sorted(df["PACC_ANIO"].unique())

# Crea el gráfico de líneas agrupadas por tipo
fig = px.line(
    df_avg_tipo_anio,                # DataFrame con los datos agrupados por año y tipo
    x="PACC_ANIO",                   # Eje X: años
    y="PACC_PRECIO_USD",             # Eje Y: precio promedio en USD
    color="PACC_TIPO",               # Color de la línea según el tipo de producto
    markers=True,                    # Muestra los puntos de cada año
    title="Evolución del precio promedio (USD) por año y tipo",  # Título del gráfico
    labels={                         # Etiquetas de los ejes y leyenda
        "PACC_ANIO": "Año",
        "PACC_PRECIO_USD": "Precio USD",
        "PACC_TIPO": "Tipo"
    },
    category_orders={"PACC_ANIO": all_years}  # Fuerza el orden de los años en el eje X
)

# Personaliza el diseño del gráfico: grilla y ejes visibles
fig.update_layout(
    xaxis=dict(
        showgrid=True,               # Mostrar grilla vertical
        showline=True,               # Mostrar línea del eje X
        title="Año",                 # Título del eje X
        tickangle=0,                 # Mantener los años horizontales
        type="category"        ,      # Eje X categórico
        linecolor="black",
    ),
    yaxis=dict(
        showgrid=True,               # Mostrar grilla horizontal
        zeroline=True,               # Mostrar línea cero en el eje Y
        title="Precio USD"  ,         # Título del eje Y
        linecolor="black",
    ),
    title=dict(
        font=dict(size=22, family="Arial", color="darkblue"),
        x=0.5, xanchor="center"
    ),
    plot_bgcolor="white",
    paper_bgcolor="white",
    font=dict(family="Arial", size=14, color="black"),
    margin=dict(l=40, r=40, t=80, b=40)
)

fig.show()  # Muestra el gráfico