Как показать только часть участка полярного ggplot с фасетом?

Предположим, что есть набор данных в полярной координате, который будет нанесен как сектор

library(ggplot2)
library(reshape2)
data <- melt(matrix(rnorm(1000), nrow = 20))
data$type <- 1:2
data$Var1 <- data$Var1*6 - 60

ggplot(data, aes(Var1, Var2)) + 
  geom_tile(aes(fill = value)) + 
  coord_polar(theta = "x", start = pi) + 
  scale_x_continuous(limits = c(-180, 180)) +
  facet_wrap(~type)

что дает следующий график:

Как мы можем удалить нижнюю (пустую) часть графика, не делая полный круг?

2 ответа

Решение

Это неумелый хак, но вы можете использовать grid функции, чтобы скрыть область, которую вы не хотите. Например:

library(ggplot2)
library(reshape2)
library(grid)

data <- melt(matrix(rnorm(1000), nrow = 20))
data$type <- 1:2
data$Var1 <- data$Var1*6 - 60

p1 = ggplot(data, aes(Var1, Var2)) + 
  geom_tile(aes(fill = value)) + 
  coord_polar(theta = "x", start = pi) + 
  scale_x_continuous(limits = c(-180, 180)) +
  facet_wrap(~type)
g1 = ggplotGrob(p1)

grid.newpage()
pushViewport(viewport(height=1, width=1, clip="on"))
grid.draw(g1)
grid.rect(x=0,y=0,height=1, width=2, gp=gpar(col="white"))

Это отрезает нижнюю половину графика (см. Ниже). Было бы неплохо найти более элегантный подход, но в противном случае, возможно, вы можете поиграть с функциями размещения в окне просмотра и рисования (не говоря уже об изменении расположения меток оси и легенды), чтобы получить что-то близкое к тому, что вы хотите.

Вот более чистое решение с ggtrace(первоначально опубликовано в твиттере ).

      library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.1.2
library(ggtrace)
library(reshape2)
data <- melt(matrix(rnorm(1000), nrow = 20))
data$type <- 1:2
data$Var1 <- data$Var1*6 - 60

p <- ggplot(data, aes(Var1, Var2)) + 
  geom_tile(aes(fill = value)) + 
  coord_polar(theta = "x", start = pi) + 
  scale_x_continuous(limits = c(-180, 180)) +
  facet_wrap(~type)

with_ggtrace(
  x = p + theme(aspect.ratio = .52),
  method = Layout$render,
  trace_steps = 5L,
  trace_expr = quote({
    panels <- lapply(panels, editGrob, vp = viewport(yscale = c(0.48, 1)))
  }),
  out = "g"
)

Создано 24 марта 2022 г. пакетом reprex (v2.0.1)

Другие вопросы по тегам