我想独立使用色标,即连续和分类尺度。
我有一个特定的应用程序,我在这里有一个简单的情节
mtcars %>%
mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
ggplot(aes(x = mpg, y = wt)) +
geom_point(aes(color = drat)) +
facet_wrap(~ cyl)
但我也想highlight border, like in the answer of Seth_P, of a specific condition(我不想使用刻面的填充背景!)。例如
mtcars %>%
mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
ggplot(aes(x = mpg, y = wt)) +
geom_point() +
geom_rect(xmin = -Inf, xmax = Inf, show.legend = FALSE,
ymin = -Inf, ymax = Inf, aes(col = cylcol), fill = "#00000000") +
facet_wrap(~ cyl)
现在我想"结合"这两个,例如:
mtcars %>%
mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
ggplot(aes(x = mpg, y = wt)) +
geom_point(aes(color = drat)) +
geom_rect(xmin = -Inf, xmax = Inf, show.legend = FALSE,
ymin = -Inf, ymax = Inf, aes(col = cylcol), fill = "#00000000") +
facet_wrap(~ cyl)
这会产生错误Error: Discrete value supplied to continuous scale
。这一方面有意义,但另一方面,由于两者都使用自变量,我想使用"不同的色标"。我可以使用叠加层,例如here, where facet colors are plotted over the plot,但我非常感谢更简单的解决方案。我知道specifying fill and color separately - 但这不是目标。我真的很想在不同的尺度上使用颜色。有什么建议 ?
答案 0 :(得分:1)
我不知道同时具有离散和连续colour
尺度的任何方式。但是,您可以使用由geom_point
填充的fill
形状而非colour
来解决此问题:
library(ggplot2)
library(dplyr)
mtcars %>%
mutate(cylcol = factor(if_else(cyl == 6, "six", "not six"))) %>%
ggplot(aes(x = mpg, y = wt)) +
geom_point(aes(fill = drat), shape = 21) +
geom_rect(aes(colour = cylcol), xmin = -Inf, xmax = Inf,
ymin = -Inf, ymax = Inf, fill = NA) +
facet_wrap(~ cyl)
这是第二种方式,可能有点过于复杂,但通过分割数据并有效地手动进行分面来实现。宽度需要根据y轴标签尺寸,图例尺寸和绘图尺寸手动调整。
library(ggplot2)
library(dplyr)
library(purrr)
lims <- list(x = range(mtcars$mpg), y = range(mtcars$wt))
make_plot <- function(data) {
cyl <- data$cyl[1]
if (cyl == 6) {
rec_col <- "light blue"
} else {
rec_col <- "red"
}
p <- data %>%
ggplot(aes(x = mpg, y = wt)) +
geom_point(aes(colour = drat)) +
geom_rect(xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf,
fill = NA, colour = rec_col) +
xlim(lims$x) + ylim(lims$y) +
facet_wrap(~ cyl)
if (cyl != 4) {
p <- p + theme(axis.title.y = element_blank(), axis.ticks.y = element_blank(),
axis.text.y = element_blank())
}
if (cyl != 8) {
p <- p + theme(legend.position = "none")
}
if (cyl != 6) {
p <- p + theme(axis.title.x = element_text(colour = "white"))
}
p
}
mtcars %>%
split(.$cyl) %>%
map(make_plot) %>%
grid.arrange(grobs = ., layout_matrix = matrix(1:3, nrow = 1),
widths = c(0.32, 0.28, 0.4))
最后,值得注意的是considered three years ago,但是我觉得没有足够的开发带宽。