在 ggplot 中绘制一个简单的转换漏斗图

2023-11-25

我有一个简单的数据框,如下所示:

df
   steps  numbers     rate
 1 clicks 332835  100.000000
 2 signup  157697  47.379933
 3  cart   29866   8.973215
 4  buys   17012   5.111241

如何绘制简单的转化漏斗而不是条形图?


如果你必须做漏斗图,它只是条形图的变体:

library(ggplot2)
library(reshape2) # for melt()

# get data
dat <- read.table(text=
"steps  numbers     rate
clicks 332835  100.000000
signup  157697  47.379933
cart   29866   8.973215
buys   17012   5.111241", 
header = T)

# add spacing, melt, sort
total <- subset(dat, rate==100)$numbers
dat$padding <- (total - dat$numbers) / 2
molten <- melt(dat[, -3], id.var='steps')
molten <- molten[order(molten$variable, decreasing = T), ]
molten$steps <- factor(molten$steps, levels = rev(dat$steps))

ggplot(molten, aes(x=steps)) +
  geom_bar(aes(y = value, fill = variable),
           stat='identity', position='stack') +
  geom_text(data=dat, 
            aes(y=total/2, label= paste(round(rate), '%')),
            color='white') +
  scale_fill_manual(values = c('grey40', NA) ) +
  coord_flip() +
  theme(legend.position = 'none') +
  labs(x='stage', y='volume')

enter image description here

也就是说,“漏斗图”中没有真正的意义- 相同的信息可以轻松地以简单的条形图呈现:

# get data
dat <- read.table(text=
"steps  numbers     rate
clicks 332835  100.000000
signup  157697  47.379933
cart   29866   8.973215
buys   17012   5.111241", 
header = T)

# order x axis
dat$steps <- factor(dat$steps, levels = dat$steps)

# plot
ggplot(dat, aes(x=steps, y=numbers)) +
  geom_bar(stat='identity') +
  geom_text(aes(label = paste(round(rate), '%')), vjust=-0.5

enter image description here

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

在 ggplot 中绘制一个简单的转换漏斗图 的相关文章

随机推荐

  • 我怎样才能每一秒都做某事? [LibGDX]

    假设我想制作一个循环或每秒打印出的内容 例如 马里奥 我怎样才能做到这一点 似乎无法在任何地方找到任何好的教程来教授这个 P 正如 BennX所说 你可以总结一下delta渲染方法中的时间或通过调用获取它Gdx graphics getDe
  • 显式使用“new EventHandler”声明有好处吗?

    将事件处理程序分配给上下文之类的东西MenuItem 例如 有两种可接受的语法 MenuItem item new MenuItem Open Image btnOpenImage Click 和 MenuItem item new Men
  • MinGW中有fmemopen()吗

    我正在尝试编译一些使用fmemopenMinGW 中的函数 我发现MinGW没有这个功能 我需要一个相当于fmemopen 我可以使用其他功能吗 由于内核中缺少功能 win32 上没有 fmemopen 等效项 我认为 cygwin 使用如
  • 无法解析符号 DaggerApplicationComponent

    我将 Dagger2 与 java 一起使用 并收到 无法解析应用程序中的符号 DaggerApplicationComponent 错误 依赖关系似乎有问题 任何帮助将非常感激 我的完整代码在这里 https github com roh
  • 如何强制 to_yaml 以文字块样式输出长字符串?

    我在哈希中有很长的字符串值 我想以文字块样式打印 以 gt or 在 YAML 中 而不是作为内联字符串 有没有办法在调用时强制执行此操作 to yaml 文字块样式的示例 this Foo Bar None
  • 错误:无法将 typeid 与 -fno-rtti 一起使用

    当我尝试编译我的项目时 我收到此消息 Cannot use typeid with fno rtti 我正在使用 opencv 框架 我用谷歌搜索了这个问题 但是 我在互联网上发现的错误似乎与我的问题无关 我不知道问题是否与包含 代码或编译
  • Qt:Qt 类与标准 C++

    标准 c 和 Qt 之间存在大量重复功能 在某些时候 这似乎合乎逻辑 但很多时候却显得愚蠢 就像我想尝试一种新的编程语言 学习我已经知道的东西 例如使用 QFile 另外 如果我全部用 Qt 方式完成 并且假设现在我想移出 Qt 框架 那么
  • SQLAlchemy,获取未绑定到会话的对象

    我试图从数据库中获取对象集合并将其传递给未连接到数据库的另一个进程 我的代码如下所示 但我不断收到 sqlalchemy exc UnboundExecutionError Instance
  • 控件中的嵌入表单或作为用户控件的表单

    好吧 我有一个大型 CRUD 应用程序 它使用嵌入了表单的选项卡 如下所示 gt public static void ShowFormInContainerControl Control ctl Form frm frm TopLevel
  • 在 DocumentDB 上使用 Any 进行子集合的 LINQ 查询问题

    使用 v1 8 Net SDK 尝试返回 Sales 其中 Sales 客户端数组包含我正在查找的客户端 ID Sales Where sale gt sale Clients Any c gt c ClientId clientID 返回
  • 同步特征是发送特征的严格子集吗?什么实现了不发送同步?

    In Rust 编程 第二版 作者 吉姆 布兰迪 杰森 奥伦多夫 利奥诺拉 F S 廷德尔第 520 页上有一个图表 显示发送和同步 并带有重叠的圆圈 其中同步完全包含在发送中 这让我相信所有实现同步的东西也必须实现发送 但是第 561 页
  • 为什么我不应该从构造函数中调用我的依赖项?

    长期以来 我一直认为从构造函数中调用类依赖项是一种不好的做法 但昨天无法向同事阐明原因 谁能提供一个不这样做的充分理由 尼古拉 马洛维奇的原因有几个国际奥委会第四定律 当我们使用构造函数注入编写应用程序时 我们经常创建大量的对象图 并且我们
  • iOS:tableView.reloadData() 无法快速工作

    我试图在 Swift 中更新数据后重新加载表视图 但它似乎不起作用 当我更改选项卡并返回时 表视图会重新加载 但不会自动加载 这是我的代码 override func viewDidLoad super viewDidLoad some c
  • 在棒棒糖版本上方的Notification中设置小图标

    我已经创建了抬头通知 就像下面这样 NotificationCompat Builder notification new NotificationCompat Builder this channelId setContentTitle
  • 八度导入函数

    我正在八度运行 matlab 代码 我猜 核心八度音阶中没有实现导入功能 知道如何在八度音程中使用这个 matlabe 函数吗 这是我所拥有的 Octave 3 4 0 7 gt 设置 导入包 brml 警告 Octave 中尚未实现 导入
  • 如何在Cakephp中检索Ajax发送的数据?

    我被这个问题困扰了一整天 我想做的是使用 Ajax 将 2 个值从视图发送到控制器 这是我的代码hot products view
  • Amazon S3 为每个对象创建唯一的密钥

    我的应用程序用户将他们的文件上传到一个存储桶 如何确保 S3 存储桶中的每个对象都有唯一的密钥以防止对象被覆盖 目前 在将文件发送到 S3 之前 我正在使用 php 脚本中的随机字符串对文件名进行加密 为了便于讨论 我们假设上传者找到了一种
  • 如何使用jquery检查多个复选框?

    我是 jquery 的新手 它很有趣 但我遇到了一个小问题 我使用 foreach 循环从数据库填充多个复选框 如下所示
  • 按组连接字符串

    我想按以下方式对记录进行分组 id并通过组合创建一个字符串client id values 以下是我的文档示例 id ObjectId 59e955e633d64c81875bfd2f tag id 1 client id 10001 id
  • 在 ggplot 中绘制一个简单的转换漏斗图

    我有一个简单的数据框 如下所示 df steps numbers rate 1 clicks 332835 100 000000 2 signup 157697 47 379933 3 cart 29866 8 973215 4 buys