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 pddf = 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 pximport plotly.io as piopio.renderers.default ="notebook"
import plotly.express as px# Agrupa el DataFrame por año, calculando el precio promediodf_avg_anio = df.groupby(["PACC_ANIO"], as_index=False)["PACC_PRECIO_USD"].mean()# Gráfico de líneas sencillo con grilla y ejes automáticosfig = 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 originalall_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 verdefig.update_traces(line=dict(color="#43B099"), marker=dict(color="#43B099"))#fig.update_traces(textposition="bottom right")# Fondo blanco y sin grillafig.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 promediodf_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 originalall_years =sorted(df["PACC_ANIO"].unique())# Crea el gráfico de líneas agrupadas por tipofig = 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 visiblesfig.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 horizontalestype="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