使用分组的多列熊猫绘制堆积条形图

2024-05-06

我有两个数据框,我需要获取它们之间的差异,然后在该差异之上绘制其中一个数据框。这是一个最小的例子:

import pandas as pd
import matplotlib.pyplot as plt

df1 = pd.DataFrame([[2,5,7,6,7],[4,4,4,4,3],[8,8,7,3,4],[16,10,12,13,16]], columns=["N", "A", "B", "C", "D"])
df2 = pd.DataFrame([[2,1,3,6,5],[4,1,2,3,2],[8,2,2,3,3],[16,8,10,3,11]], columns=["N", "A", "B", "C", "D"])

dfDiff = df1 - df2
dfDiff['N'] = df1['N']

# Individual barchart
colors = ['#6c8ebf', '#82b366', '#F7A01D', '#9876a7']
df1.set_index('N')[["A", "B", "C", "D"]].plot.bar(color=colors)
df2.set_index('N')[["A", "B", "C", "D"]].plot.bar(color=colors)

dfStacked = pd.DataFrame(columns=["N", "A", "A_diff", "B", "B_diff"])
dfStacked["N"] = df2["N"]
dfStacked["A"] = df2["A"]
dfStacked["B"] = df2["B"]
dfStacked["C"] = df2["C"]
dfStacked["D"] = df2["D"]
dfStacked["A_diff"] = dfDiff["A"]
dfStacked["B_diff"] = dfDiff["B"]
dfStacked["C_diff"] = dfDiff["C"]
dfStacked["D_diff"] = dfDiff["D"]

dfStacked.set_index('N').plot.bar(stacked=True)

plt.show()

The dataframes look like this: df1 df2 The thing is that now the new stacked one ends up with everything merged. I want to have "A" stacked with "A_diff", "B", stacked with "B_diff", "C" stacked with "C_diff" and "D" stacked with "D_diff". enter image description here For example, I changed the code to do it with "A" and "A_diff" as dfStacked.set_index('N')[["A", "A_diff"]].plot.bar(stacked=True) which looks correct, but I want A,B,C and D grouped by N like in the first two figures. enter image description here

我是否需要一个新的数据框,例如dfStacked?如果可以,应该以什么形式添加内容?我怎样才能保留same颜色但添加hatch="/" only对于“顶部”堆叠栏?

数据框如下所示会更好吗?:

df3 = pd.DataFrame(columns=["N", "Algorithm", "df1", "dfDiff"])
df3.loc[len(df3)] = [2, "A", 20, 10]
df3.loc[len(df3)] = [2, "A", 1, 4]
df3.loc[len(df3)] = [4, "A", 2, 3]
df3.loc[len(df3)] = [4, "A", 3, 4]
df3.loc[len(df3)] = [2, "B", 1, 3]
df3.loc[len(df3)] = [2, "B", 2, 4]
df3.loc[len(df3)] = [4, "B", 3, 3]
df3.loc[len(df3)] = [4, "B", 4, 2]

但如何按“N”和“算法”对它们进行分组呢?我的意思是,每一行对应一个条,只是它们应该按“N”与所有“算法”分组,最后两列是每个条的两个“部分”。颜色与前两个数字(对于“算法”)相匹配会很好,但是条形图的顶部有hatch="/"例如。


我将从df1, df2并得到dfStacked以稍微不同的方式:

import pandas as pd

df1 = pd.DataFrame(
    [
        [2,5,7,6,7],
        [4,4,4,4,3],
        [8,8,7,3,4],
        [16,10,12,13,16]
    ], 
    columns=["N", "A", "B", "C", "D"]
).set_index('N')

df2 = pd.DataFrame(
    [
        [2,1,3,6,5],
        [4,1,2,3,2],
        [8,2,2,3,3],
        [16,8,10,3,11]
    ], 
    columns=["N", "A", "B", "C", "D"]
).set_index('N')

dfStacked = pd.concat(
    [df1, df1-df2], 
    axis=1, 
    keys=['raw','diff']
).reorder_levels([1,0], axis=1)

现在我们有这个DataFrame:

要在按第一级堆叠的条形图中绘制这些数据,我们可以使用两个DataFrame.plot的特点——ax and bottom。第一个是应绘制条形图的轴的位置,第二个是条形底线应开始的值。详情请运行help(plt.bar)阅读有关bottom and help(pd.DataFrame.plot)阅读有关ax.

import matplotlib.pyplot as plt
from matplotlib.colors import TABLEAU_COLORS

plt.figure(figsize=(10,7))
ax = plt.gca()

names = dfStacked.columns.levels[0]
n = len(names)
color = iter(TABLEAU_COLORS)
w = 1/(n+2)       # width
h = '/'*5         # hatch for diff values
for i, name in enumerate(names):
    c = next(color)   # color
    p = n/2 - i       # position
    dfStacked[name]['raw'].plot.bar(
        ax=ax, 
        position=p, 
        width=w, 
        color=c,
        label=f'{name} raw'
    )
    dfStacked[name]['diff'].plot.bar(
        ax=ax, 
        bottom=dfStacked[name]['raw'], 
        hatch=h,
        position=p,
        width=w, 
        color=c,
        label=f'{name} diff'
    )

ax.set_xlim([-1, n])
ax.tick_params(axis='x', rotation=0)
ax.legend();

这是输出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用分组的多列熊猫绘制堆积条形图 的相关文章

随机推荐

  • Nodejs中的模拟电子邮件功能

    我已经构建了一个邮件程序功能 并试图加强覆盖范围 事实证明 尝试测试它的某些部分很棘手 特别是这个 mailer smtpTransport sendMail var nodemailer require nodemailer var ma
  • App Engine 上的 HTTP 到 HTTPS 重定向灵活

    我已经遵循了这个答案 在谷歌云中从http重定向到https https stackoverflow com questions 37135051 redirect from http to https in google cloud但目前
  • 在命令行上解密使用 PHP openssl_encrypt 制作的文件

    我有一个要加密的字符串 encryptThis Super Secret Text echo openssl encrypt encryptThis aes 128 cbc 1234 FALSE F68A9A229A516752 然后我通过
  • 在电子邮件中设置 html 样式

    我正在为有能力的客户发送 HTML 版本的电子邮件 现在这不是几乎全部吗 我担心的是如何设计它 我使用内联CSS吗 我可以在 html 中包含样式表吗 html 是否以 or 我可以阅读这方面的标准吗 我在造型方面能走多远 我有边框半径 背
  • C++ 中的模块路径到 Java JNI 调用

    当我用 C 创建 Java 8 JVM 时 我通常使用类似以下代码的内容来告诉 JVM 类路径 JavaVMOption options new JavaVMOption 1 JVM invocation options options 0
  • 指向二维数组的指针和手动内存管理 - C

    我认为用纯 C 语言构建一个库来处理各种矩阵计算将是一个很好的挑战 现在 尽管我在 Objective C 和 Cocoa 方面有一些很好的经验 但我对 C 的了解正是我所需要的与 Objective C 一起工作 仅此而已 例如 我熟悉
  • 编译错误:computeFrames 选项不支持 JSR/RET

    当我编译 java 文件时 在 IntelliJ 项目上出现此错误 没有列出特定的源文件 但它失败并出现此错误 删除以下编译器标志可修复该错误 source 1 5 target 1 5 然而 这些需要在那里 因为我们的目标是 Java 5
  • Hibernate vs JPA vs JDO - 各自的优缺点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉 ORM 这个概念 几年前我什至在 NET 项目中使用过 nHibernate 然而 我还没有跟上 Java 中 ORM 的主题
  • iOS Objective-C 对象:何时使用release,何时不使用它

    我在 iOS 下 正在使用 delphi Tokyo 进行开发 这是我的代码 aUIImage TUIImage Wrap TUIImage alloc initWithCGImage aCGImageRef try aData TNSDa
  • Hibernate/JPA 在启动时不验证数据库架构

    由于某种原因 hibernate 无法捕获诸如将实体映射到不存在的表之类的问题 我的 persistence xml 文件看起来像这样
  • 通过 adb 将触摸事件发送到设备[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下方式将触摸事件发送到设备adb shell命令 这样我就可以为 UI 测试做一些基本的自动化 我已经关注了之前一些关于此问题的讨论 我确认了获取事件并使用sendevent 为每次触摸发送 6
  • ANSI C,整数到字符串,不带可变参数函数

    我目前正在使用支持 ANSI C 的 PLC 但使用它自己的 GNU 编译器风格 它不编译任何可变参数函数和 itoa 之类的东西 所以使用 sprintf co 不是将整数转换为字符串的选项 任何人都可以引导我到一个列出了健壮的 无 sp
  • NotificationCompact.Builder 和 ActionBarSherlock 的问题

    在下面的代码中 Eclipse发现错误 The method build is undefined for the type NotificationCompat Builder 在添加之前一切正常ActionBarSherlock htt
  • onClick 在 p 标签上无法正常工作

    我想为每个绑定一个点击事件 p 但它似乎不能正常工作 当我运行脚本时 我立即收到三个警报 我只想在单击三个中的任何一个时获得它们 p p s 谁能告诉我我做错了什么 编辑 抱歉 这就是它的样子 HTML 应该是这样的 p p class s
  • Laravel 4 JSON 响应与 Cookie

    如何设置带有 json 响应的 cookie 我注意到 至少对我来说 以下命令是唯一可以设置 cookie 的命令 return Redirect to gt withCookie Cookie make blog cookie value
  • 将 Typescript 项目打包为可执行文件

    如何将 Typescript 项目打包成可执行文件 由于我找了一段时间没有找到 所以我使用了 now 节点来实现上述目的 我正在发布我所做的事情 希望有人会觉得它有用 将Typescript项目编译成node 根据this https me
  • 使用 ABAddressBookRegisterExternalChangeCallback 注册的地址簿更改回调永远不会被调用 (iOS 8)

    我已经找到了很多与此相关的示例 但在阅读整个 ABAddressBook 文档后 我仍然无法弄清楚为什么在我的情况下 我的更改回调没有被调用 我只是设置了一个地址簿并为其注册了一个回调函数 我可以很好地访问地址簿 但无论我在 联系人 应用程
  • Vue 3:“defineProps”引用本地声明的变量

    为什么我收到警告错误消息 defineProps引用本地声明的变量 eslint vue valid define props 当我在 props 中使用自定义验证器时SFC
  • escape()、encodeURI()、encodeURIComponent() 之间的区别

    在 JavaScript 中 它们之间有什么区别 escape unescape encodeuri decodeuri encodeURIComponent decodeURIComponent 对于有视觉头脑的人来说 这里有一个表格显示
  • 使用分组的多列熊猫绘制堆积条形图

    我有两个数据框 我需要获取它们之间的差异 然后在该差异之上绘制其中一个数据框 这是一个最小的例子 import pandas as pd import matplotlib pyplot as plt df1 pd DataFrame 2