Почему эти барплоты друг на друга? - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь создать субплоты, используя matplotlib, где есть 2 строки и 3 столбца. У меня есть датафрейм df со столбцами A через F. Я хочу, чтобы каждый из вспомогательных графиков представлял собой столбчатую диаграмму каждого столбца A thru F.

Я уверен, что это всего лишь небольшая ошибка в коде, но как мне заставить их отображать различныеучастки и не все друг на друге?

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(4,15,size=(100, 6)), columns=list('ABCDEF'))
df['A'].value_counts()

rows, cols = 2,3
fig, ax = plt.subplots(rows, cols, sharex='col', sharey='row')

myplots = ['A','B','C','D','E','F']

for j in myplots:
    x = range(len(df[j].value_counts()))
    for row in range(2):
        for col in range(3):
            ax[row, col].bar(x, df[j].value_counts().sort_index())

enter image description here

Ответы [ 2 ]

1 голос
/ 18 октября 2019

IIUC, вы хотите построить подсчет значений для каждого столбца на отдельных вспомогательных участках:

(df.stack().groupby(level=1)
     .value_counts()
     .unstack(level=0)
     .plot.bar(layout=(2,3), subplots=True));

Вывод:

enter image description here


Примечание: для ответа на ваш вопрос почему ... :

for j in myplots:
    x = range(len(df[j].value_counts()))
    for row in range(2):
        for col in range(3):

Поскольку цикл j является наиболее внешним, вы эффективно рисуетезначения счетчиков каждого столбца (df[j]) на каждом участке. Вот почему субплоты выглядят одинаково.

Чтобы ваше решение работало, используйте zip:

rows, cols = 2,3
fig, axes = plt.subplots(rows, cols, sharex='col', sharey='row')

myplots = ['A','B','C','D','E','F']

for j, ax in zip(myplots, axes.ravel()):
    df[j].value_counts(sort=False).plot.bar(ax=ax)

Вывод:

enter image description here

0 голосов
/ 17 октября 2019

Как то так? (На мой взгляд, это была ошибка в решении индекса)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.DataFrame(np.random.randint(4,15,size=(100, 6)), columns=list('ABCDEF')).  #  (100,6)
df['A'].value_counts()

rows, cols = 2,3
fig, ax = plt.subplots(rows, cols, sharex='col', sharey='row')

myplots = ['A','B','C','D','E','F']

#for j in myplots:
    #x = range(len(df[j].value_counts()))
for row in range(2):
    for col in range(3):
        ind = row*3+col  # here it is
        # ax[row, col].bar(list(range(len(df['A']))), df[myplots[ind]])

        set_of_values = df[myplots[ind]].value_counts()
        count_of_values = df[myplots[ind]].value_counts().sort_index()        
        ax[row, col].bar(set_of_values, count_of_values)

        ax[row,col].set_xlabel(myplots[ind])

enter image description here

...