将计数添加到ggmosaic中,这可以更简单吗?

时间:2018-05-08 07:12:39

标签: r ggplot2 ggmosaic

我想使用ggmosaic包制作马赛克图,并添加计数,如下例所示。

示例类型的工作,但我发现代码的结构非常难看。 您对我如何改进代码,使其更具可重用性有任何建议吗?

与使用ggplot2通常可以实现的情况相比,特别需要在临时变量中存储早期版本的图形似乎是错误的。

library(tidyverse)
library(ggmosaic)
#> Indlæser krævet pakke: productplots
#> 
#> Vedhæfter pakke: 'ggmosaic'
#> De følgende objekter er maskerede fra 'package:productplots':
#> 
#>     ddecker, hspine, mosaic, prodcalc, spine, vspine

data <- tribble(~a, ~b, 
                1, 1, 
                1, 1, 
                1, 1, 
                1, 2, 
                2, 1,
                2, 2, 
                3, 2)

p <- ggplot(data) + 
  geom_mosaic(aes(x=product(b, a), fill=as.factor(b)))

p + 
  geom_label(data = ggplot_build(p)$data %>% as.data.frame() %>% filter(.wt > 0), 
             aes(x = (xmin + xmax)/2, 
                 y = (ymin + ymax)/2, 
                 label = .wt))

reprex package(v0.2.0)创建于2018-05-08。

2 个答案:

答案 0 :(得分:2)

我在纯ggplot2中制作了类似的图表,而没有使用ggmosaic包。我不知道这对你的用例是否足够,但是:

# data manipulation
data %>%
  group_by(a, b) %>%
  summarise(n = n()) %>%
  mutate(x.width = sum(n)) %>%

  # simulate mosaic plot
  ggplot(aes(x = factor(a), y = n)) +
  geom_col(aes(width = x.width, fill = factor(b)),
           colour = "white", size = 1, position = position_fill(reverse = TRUE)) +
  geom_label(aes(label = n),
             position = position_fill(vjust = 0.5)) +
  facet_grid(~ a, space = "free", scales = "free", switch = "x") +

  # cosmetic tweaks
  scale_x_discrete(name = "a") +
  scale_y_continuous(labels = scales::percent) +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.title.y = element_blank(),
        strip.background = element_blank(),
        panel.spacing = unit(0, "pt"))

previously

答案 1 :(得分:1)

这是使用提供的代码进行此操作的一种方法,但无需保存临时绘图。它利用ggplot的52 class TSF_ML_2_1 { 53 let model: MLModel 54 class var urlOfModelInThisBundle : URL { 55 let bundle = Bundle(for: self) 56 return bundle.url(forResource: "TSF_ML_2 1", withExtension:"mlmodelc")! 57 } 58 init(model: MLModel) { 59 self.model = model 60 } 61 @available(*, deprecated, message: "Use init(configuration:) instead and handle errors appropriately.") 62 convenience init() { 63 try! self.init(contentsOf: type(of:self).urlOfModelInThisBundle) 64 } ... } 来访问绘图对象直到最新的'+',并且还使用last_plot而不是layer_data来更简单地访问数据。

ggplot_build

reprex package(v0.3.0)于2020-07-05创建

它仍然是一个hack,但是它将减轻您分配临时剧情的痛苦。