首页 > 解决方案 > ggplot:用离散变量绘制瓷砖/矩形

问题描述

我正在尝试绘制瓷砖/矩形以获得以下结果:

library(tidyverse)
library(plotly)

set.seed(0)
df <- tibble(
  a = runif(5),
  b = runif(5),
  c = runif(5),
  d = runif(5),
  case_id = 1:5
) %>% tidyr::pivot_longer(cols = -case_id)

plot <- ggplot2::ggplot(
  data = df,
  mapping = aes(
    x = name,
    y = value,
    group = case_id
  )
) + geom_point()

plot_boxes_y <- seq(from = 0, to = 1, by = .2)
plot_boxes_x <- unique(df$name) %>% length()

for (x in 1:plot_boxes_x) {
  for (y in plot_boxes_y) {
    plot <- plot + geom_rect(
      mapping = aes_(
        xmin = x - .5,
        xmax = x + .5,
        ymin = y - .5,
        ymax = y + .5
      ),
      color = "red",
      fill = NA
    ) 
  }
}

plotly::ggplotly(plot)

期望的输出

如您所见,我目前通过循环遍历坐标并分别绘制每个矩形来做到这一点。问题是,这会生成许多层,这使得plotly::ggplotly()大型数据集的运行速度非常慢。

因此,我正在寻找一种更有效的方法。请注意,我不能使用panel.grid, 因为我打算z稍后通过填充矩形来可视化 -data。

我的方法是geom_tile()在散点图上绘制:

# my attempt
df$z <- rep(0, nrow(df))

plot2 <- ggplot2::ggplot(
  data = df,
  mapping = aes(
    x = name,
    y = value,
    color = z,
    group = case_id
  )
) + geom_point() + geom_tile()

我认为这失败是因为它name是一个离散变量?那么,除了散点图之外,我如何有效地绘制图块?谢谢

标签: rggplot2

解决方案


这是使用该geom_tile选项的解决方案。这里的关键是创建一个数据框来保存网格的坐标,然后在每个函数调用中单独指定美学。

library(ggplot2)
library(tidyr)

set.seed(0)
df <- tibble(
  a = runif(5),
  b = runif(5),
  c = runif(5),
  d = runif(5),
  case_id = 1:5
) %>% pivot_longer(cols = -case_id)

df$z <- rep(0, nrow(df))

#make data frame for the grid corrdinates
grid<-data.frame(x=factor( ordered( 1:4), labels = c("a", "b", "c", "d" )),
                  y=rep(seq(0, 1, .1), each=4))

#plot using geom_tile & geom_point
plot2 <- ggplot2::ggplot() + geom_tile(data=grid, aes(x=x, y=y), fill=NA, col="red") +
   geom_point(data = df,
                 mapping = aes(
                   x = name,
                   y = value,
                   color = z,
                   group = case_id)) 

print(plot2)

在此处输入图像描述


推荐阅读