Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这些条形图彼此重叠?_Python_Pandas_For Loop_Matplotlib - Fatal编程技术网

Python 为什么这些条形图彼此重叠?

Python 为什么这些条形图彼此重叠?,python,pandas,for-loop,matplotlib,Python,Pandas,For Loop,Matplotlib,我正在尝试使用matplotlib创建子图,其中有2行3列。我有一个数据帧df,其中a列到F列。我希望每个子图都是a列到F列的条形图 我确信这只是代码中的一个小错误,但是我如何让它们在不同的子图中绘制,而不是全部在彼此之上 作为pd进口熊猫 将numpy作为np导入 df=pd.DataFramenp.random.randint4,15,size=100,6,columns=list'ABCDEF' df['A'].值_计数 行,cols=2,3 图,ax=plt.subplotsrows,c

我正在尝试使用matplotlib创建子图,其中有2行3列。我有一个数据帧df,其中a列到F列。我希望每个子图都是a列到F列的条形图

我确信这只是代码中的一个小错误,但是我如何让它们在不同的子图中绘制,而不是全部在彼此之上

作为pd进口熊猫 将numpy作为np导入 df=pd.DataFramenp.random.randint4,15,size=100,6,columns=list'ABCDEF' df['A'].值_计数 行,cols=2,3 图,ax=plt.subplotsrows,cols,sharex='col',sharey='row' myplots=['A','B','C','D','E','F'] 对于myplots中的j: x=rangelendf[j]。值_计数 对于范围2中的行: 对于范围3中的col: ax[行,列].barx,df[j].值\计数.排序\索引
像这样的?在我看来,这是索引求解的错误

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])

IIUC,要在单独的子批次中绘制每列的值计数:

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

注:要回答您的问题,为什么…:

因为j循环是最外层的,所以可以有效地利用 每个子批次上每列df[j]的值计数。这就是为什么子地块看起来完全相同

要使您的解决方案正常工作,请使用zip:

输出:


但是代码的值_counts部分发生了什么变化?当我为我的数据尝试你的代码时,它只是绘制所有原始数据。请注意,我已将dataframe第5行代码中矩阵的维数从100,6更改为10,6,以使绘图更具可读性。也许这是原因,不是的。原始数据帧的长度为100多行。最后需要绘制的是:df[j]。value_counts.sort_index返回一系列唯一的值,而不是原始数据。您的子图看起来不错,但我认为它实际上没有绘制我想要的。我已进行了更新。现在它计算并绘制唯一值correct,我想实际使用for循环。你认为有办法让我的代码在上面工作吗?
for j in myplots:
    x = range(len(df[j].value_counts()))
    for row in range(2):
        for col in range(3):
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)