Python 为什么这些条形图彼此重叠?
我正在尝试使用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].值\计数.排序\索引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
像这样的?在我看来,这是索引求解的错误
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)