Tengo el siguiente marco de datos de pandas:

enter image description here

Mi objetivo es trazar el marco de datos en 3 columnas, donde cada columna es una 'sección'. Y, al mismo tiempo, cada gráfica es una subparcela de 3 líneas y 1 columna, donde una línea es 'Col1 [%]', la segunda línea es 'Col 2' y la última es 'Col 3 [%]'

Si configuro subplots = True , obtengo el siguiente gráfico:

enter image description here

De lo contrario, con subtramas = Falso , obtengo:

enter image description here

Pero lo que necesito es obtener las 3 columnas, pero donde el gráfico de cada columna será igual al gráfico con suplots = True. ¿Cómo puedo hacer eso?

¡Muchas gracias por adelantado!

Mi código:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

# DATA
dfplot = pd.DataFrame(columns = ['section', 'description', 'Col1 [%]', 'Col 2', 'Col 3 [%]'])
dfplot['description'] = ['d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9']
dfplot['section'] = [1, 1, 1, 2, 2, 2, 3, 3, 3]
dfplot['Col1 [%]'] = [82, 89, 86, 100, 100, 99, 16, 16, 16]
dfplot['Col 2'] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
dfplot['Col 3 [%]'] = [99.19, 98.7, 99.36, 99.9, 99.93, 99.5, 97.66, 97.84, 97.66]
dfplot = dfplot.groupby(['section', 'description'], as_index=True).last()


# PLOT -------------

# Set levels to group labels in ax X
cols = list(set(l_columns_values))
dfplot.index.set_levels([cols, l_strains], level=[0,1])

fig, axes = plt.subplots(nrows=1, ncols=len(cols), 
                         sharey=True, sharex=True, 
                         figsize=(14 / 2.54, 10 / 2.54) # width, height
                        )  

for i, col in enumerate(list(set(l_contigs))):
    ax = axes[i] #, j]
    
    print(ax)
    print("i= {}, col= {}".format(i, col))

    dfplot.loc[col].plot.area(ax=ax,
                              #layout=(3, 1),
                              stacked=True, 
                              subplots=True, ## <--     
                              grid=True,
                              table=False,
                              sharex=True,
                              sharey=True,
                              figsize=(20,7),
                              fontsize=12,
                              #xticks = np.arange(0, len(cols)+1, 1)
                             )
    #ax[i].set_ylim(-1,100)
    ax.set_xlabel(col, weight='bold', fontsize=20)
    ax.set_axisbelow(True)    

    for tick in ax.get_xticklabels():
        tick.set_rotation(90)

# make the ticklines invisible
ax.tick_params(axis=u'both', which=u'both', length=0)
plt.tight_layout()

# remove spacing in between
fig.subplots_adjust(wspace=0.5)  # space between plots

# legend
plt.legend(loc='upper right')

# Add title
fig.suptitle('My title')

plt.show()    
0
Valtriz 27 ago. 2020 a las 12:54

1 respuesta

La mejor respuesta

Un poco de interpretación: un gráfico para cada columna y sección.

Hubo un problema en su código: estaba sobrescribiendo la matriz ax con una referencia a ella. Usé un nombre de variable diferente: axt

dfplot = pd.DataFrame(columns = ['section', 'description', 'Col1 [%]', 'Col 2', 'Col 3 [%]'])
dfplot['description'] = ['d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9']
dfplot['section'] = [1, 1, 1, 2, 2, 2, 3, 3, 3]
dfplot['Col1 [%]'] = [82, 89, 86, 100, 100, 99, 16, 16, 16]
dfplot['Col 2'] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
dfplot['Col 3 [%]'] = [99.19, 98.7, 99.36, 99.9, 99.93, 99.5, 97.66, 97.84, 97.66]
# dfplot = dfplot.groupby(['section', 'description'], as_index=True).last()
dfplot = dfplot.set_index(["section", "description"])

fig, ax = plt.subplots(len(dfplot.index.get_level_values(0).unique()),len(dfplot.columns), figsize=[20,5],
                      sharey=True, sharex=False)

# Add title
fig.suptitle('My title')

for i,v in enumerate(dfplot.index.get_level_values(0).unique()):
    for j, c in enumerate(dfplot.columns):
        axt = ax[j][i]
        dfplot.loc[(v),[c]].plot.area(ax=axt, stacked=True)
        axt.set_xlabel(f"Section {v}", weight='bold', fontsize=20)
        axt.set_axisbelow(True) 
        # make the ticklines invisible
        axt.tick_params(axis=u'both', which=u'both', length=0)
        axt.legend(loc='upper right')

        for tick in axt.get_xticklabels():
            tick.set_rotation(90)

salida

enter image description here

0
Rob Raymond 27 ago. 2020 a las 11:04