遍历数据框并绘制每一列

Posted

技术标签:

【中文标题】遍历数据框并绘制每一列【英文标题】:Iterating through a dataframe and plotting each column 【发布时间】:2019-11-24 09:48:20 【问题描述】:

我正在分析一些包含一周中每一天的列的调查数据。列中只能有两个值,如果受访者当天工作,则为 1,如果他们不工作,则为 0。我希望能够为一周中的每一天绘制一个计数图。但是,当我运行下面的代码时,前七个子图是空白的,而第八个子图显示的是计数图。如果 x 轴标记为星期日,则最后一个绘图的标题。

f, ax = plt.subplots(nrows = 4, ncols = 2, figsize=(12,18))
work_days = df[['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']]
row = 0
col = 0
for i in work_days:
    g = sns.countplot(x=i,data=work_days)
    g.set(title = column)
    col += 1
    if col == 2:
        col = 0
        row += 1

plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=.5)

我也试过下面的代码:

f, ax = plt.subplots(nrows = 4, ncols = 2, figsize=(12,18))
work_days = df[['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']]
row = 0
col = 0
for i, col in enumerate(work_days):
    g = sns.countplot(x=i,data=work_days)
    g.set(title = column)
    col += 1
    if col == 2:
        col = 0
        row += 1

plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=.5)

此代码产生一个 TypeError: 'int' object is not iterable。

对此的任何帮助将不胜感激。

【问题讨论】:

这对于seabornFacetGrid 来说可能是一项不错的任务。可能需要根据seaborn 文档将数据重塑为“整洁”的数据。 【参考方案1】:

如果我理解正确:

df = pd.DataFrame(data = np.random.randint(low=0,high=2,size=(10,5)),
                  columns=['Mon','Tues','Weds','Thurs','Fri'])
df2 = df.melt(var_name='day', value_name='worked')
g = sns.FacetGrid(data=df2, col='day', col_wrap=3)
g.map(sns.countplot, 'worked', order=[0,1])
plt.show()

【讨论】:

是的!这正是我一直在寻找的。谢谢布伦丹! @miguelf88 如果有帮助,请考虑接受/支持答案。另外,如果您还没有,请查看seaborn.FacetGrid 的文档 - 它解释了您可以通过的各种选项,这对于改进图表的整体外观非常有帮助。 您能解释一下为什么前两个图没有沿 x 轴标记吗? @miguelf88 这就是默认情况下 FacetGrid 的工作方式——重叠轴在底部标记以避免重复相同的信息。如果您想覆盖它,请参阅this answer。 谢谢布伦丹。你帮了大忙。

以上是关于遍历数据框并绘制每一列的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:应用pivot_longer函数将数据从宽格式转换为长格式为dataframe的每一列绘制密度图和直方图(堆叠)

在 ggplot/ggmap 中绘制多个数据框并创建统一图例的问题

如果循环一个数据框并在该循环内创建新列,它会是无穷无尽的吗?

如何在 pandas / matplotlib 中绘制多条线

迭代数据框并根据一列的值在具有前一行值的新列中执行操作

迭代地绘制ggplot中的所有列