加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 具有可变宽度元素的堆??积条形图?

发布时间:2020-12-20 12:38:33 所属栏目:Python 来源:网络整理
导读:在Tableau中,我习惯于制作如下图所示的图形.它具有每天(或其他一些离散变量),不同颜色,高度和宽度的堆叠条形图. 您可以将这些类别想象成我向人们展示的不同广告.高度对应于我展示广告的人数百分比,宽度对应于接受率. 它让我可以很容易地看到我应该更频繁地展
在Tableau中,我习惯于制作如下图所示的图形.它具有每天(或其他一些离散变量),不同颜色,高度和宽度的堆叠条形图.

您可以将这些类别想象成我向人们展示的不同广告.高度对应于我展示广告的人数百分比,宽度对应于接受率.

它让我可以很容易地看到我应该更频繁地展示哪些广告(短而宽的酒吧,如9月13日和14日的’C’类别),我应该更少地展示(高,窄条,像” H’类别于9月16日).

关于如何在R或Python中创建这样的图形的任何想法?

enter image description here

解决方法

不幸的是,用ggplot2(我认为)实现这一点并不是那么简单,因为geom_bar并不真正支持改变相同x位置的宽度.但是通过一些努力,我们可以实现相同的结果:

创建一些假数据

set.seed(1234)
d <- as.data.frame(expand.grid(adv = LETTERS[1:7],day = 1:5))
d$height <- runif(7*5,1,3)
d$width <- runif(7*5,0.1,0.3)

我的数据加起来不是100%,因为我很懒.

head(d,10)

#    adv day   height     width
# 1    A   1 1.227407 0.2519341
# 2    B   1 2.244599 0.1402496
# 3    C   1 2.218549 0.1517620
# 4    D   1 2.246759 0.2984301
# 5    E   1 2.721831 0.2614705
# 6    F   1 2.280621 0.2106667
# 7    G   1 1.018992 0.2292812
# 8    A   2 1.465101 0.1623649
# 9    B   2 2.332168 0.2243638
# 10   C   2 2.028502 0.1659540

为堆叠创建一个新变量

我认为我们不能轻易使用position_stack,所以我们自己就是这样做的.基本上,我们需要计算每个柱的累积高度,按天分组.使用dplyr我们可以很容易地做到这一点.

library(dplyr)
d2 <- d %>% group_by(day) %>% mutate(cum_height = cumsum(height))

制作情节

最后,我们创建了情节.请注意,x和y指的是瓷砖的中间部分.

library(ggplot2)
ggplot(d2,aes(x = day,y = cum_height - 0.5 * height,fill = adv)) +
  geom_tile(aes(width = width,height = height),show.legend = FALSE) +
  geom_text(aes(label = adv)) +
  scale_fill_brewer(type = 'qual',palette = 2) +
  labs(title = "Views and other stuff",y = "% of views")

如果你不想正确地缩放宽度(到某些< 1),你可以改用facet:

ggplot(d2,aes(x = 1,show.legend = FALSE) +
  geom_text(aes(label = adv)) +
  facet_grid(~day) +
  scale_fill_brewer(type = 'qual',y = "% of views",x = "")

结果

enter image description here

enter image description here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读