r - 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
是一个离散变量?那么,除了散点图之外,我如何有效地绘制图块?谢谢
解决方案
这是使用该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)
推荐阅读
- c - 如何在 C 中输入输入运算符?
- node.js - Node & docker-compose:npm 链接包
- node.js - Sequelize-test-helpers 和 calledWith AssertionError 未定义参数
- sql - SQL 浮点和是否受 order-by 子句影响?
- c - 执行这部分程序时int大小溢出
- python - 如何检测 rect 是否触及 pygame 中的边缘?
- r - 在包函数中使用 bang-bang (!!) 和 walrus (:=) 的最佳实践
- sql - 按日期在多行中输出汇总结果
- button - 在电报机器人上设置内联按钮
- python - Bio.Application.ApplicationError:非零返回码 -10