pandas agrega una leyenda automáticamente cuando un gráfico tiene varias columnas. Las etiquetas de la leyenda son los nombres de las columnas y la leyenda se puede personalizar con el argumento legend de plot y con el método legend de matplotlib.
Llama a ax.legend sobre los ejes que devuelve plot para cambiar la posición de la leyenda con loc.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"Portátiles": [120, 135, 150, 145, 170, 190],
"Móviles": [200, 210, 190, 230, 250, 270],
"Tabletas": [80, 75, 90, 85, 95, 100]},
index = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"])
ax = df.plot(marker = "o")
ax.legend(loc = "upper left")
# plt.show()

Leyenda fuera del gráfico
Combina loc con bbox_to_anchor para colocar la leyenda fuera del gráfico.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"Portátiles": [120, 135, 150, 145, 170, 190],
"Móviles": [200, 210, 190, 230, 250, 270],
"Tabletas": [80, 75, 90, 85, 95, 100]},
index = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"])
ax = df.plot(marker = "o", linewidth = 2)
ax.legend(title = "Producto", loc = "upper left", bbox_to_anchor = (1, 1),
fontsize = 12, title_fontsize = 13)
# plt.show()

La forma más sencilla de cambiar las etiquetas es renombrar las columnas antes de representarlas.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"Portátiles": [120, 135, 150, 145, 170, 190],
"Móviles": [200, 210, 190, 230, 250, 270],
"Tabletas": [80, 75, 90, 85, 95, 100]},
index = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"])
df.rename(columns = {"Portátiles": "Ventas de portátiles", "Móviles": "Ventas de móviles",
"Tabletas": "Ventas de tabletas"}).plot()
# plt.show()

Título de la leyenda
Agrega un título a la leyenda con el argumento title de ax.legend.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"Portátiles": [120, 135, 150, 145, 170, 190],
"Móviles": [200, 210, 190, 230, 250, 270],
"Tabletas": [80, 75, 90, 85, 95, 100]},
index = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"])
ax = df.plot()
ax.legend(title = "Producto", ncol = 3)
# plt.show()

Establece legend = "reverse" para mostrar los elementos en orden inverso. Es útil en los gráficos apilados, para que el orden de la leyenda coincida con el orden de las barras.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"Portátiles": [120, 135, 150, 145, 170, 190],
"Móviles": [200, 210, 190, 230, 250, 270],
"Tabletas": [80, 75, 90, 85, 95, 100]},
index = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"])
df.plot.bar(stacked = True, legend = "reverse", rot = 0)
# plt.show()

Establece legend = False para crear el gráfico sin leyenda.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"Portátiles": [120, 135, 150, 145, 170, 190],
"Móviles": [200, 210, 190, 230, 250, 270],
"Tabletas": [80, 75, 90, 85, 95, 100]},
index = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"])
df.plot(legend = False)
# plt.show()

Consulta el tutorial sobre la leyenda en matplotlib para el resto de opciones de la leyenda.
También te puede interesar