Градиентная заливка скрипичных участков с использованием ggplot2
Я хочу градиентно заполнить сюжет скрипки на основе плотности точек в бункерах (синий для максимальной плотности и красный для самой низкой).
Я сгенерировал график, используя следующие команды, но не смог его покрасить в зависимости от плотности (в данном случае ширины скрипки. Я также хотел бы сгенерировать прямоугольники с похожей окраской).
library("ggplot2")
data(diamonds)
ggplot(diamonds, aes(x=cut,y=carat)) + geom_violin()
2 ответа
Чтобы изменить цвет сюжета скрипки, вы используете fill = variable, например:
ggplot(diamonds, aes(x=cut,y=carat)) + geom_violin(aes(fill=cut))
То же самое относится и к боксу
ggplot(diamonds, aes(x=cut,y=carat)) + geom_boxplot(aes(fill=cut))
но какое бы значение вы ни имели, оно должно иметь одинаковое значение для каждого среза, то есть, если вы хотите использовать, например, среднее значение глубины / среза в качестве цветовой переменной, вам придется ее кодировать.
с помощью dplyr группируйте ваши алмазы по разрезу и с суммированием получайте среднюю глубину (или любую другую переменную)
library(dplyr)
diamonds_group <- group_by(diamonds, cut)
diamonds_group <- summarize(diamonds_group, Mean_Price = mean(price))
Затем я использовал diamonds2 в качестве копии алмазов, чтобы затем манипулировать набором данных
diamonds2 <- diamonds
Я объединяю оба кадра данных, чтобы получить Mean_Depth как переменную в diamonds2
diamonds2 <- merge(diamonds2, diamonds_group)
И теперь я могу нарисовать его со средней глубиной как переменную цвета
ggplot(diamonds2, aes(x=cut,y=carat)) + geom_boxplot(aes(fill=Mean_Price)) + scale_fill_gradient2(midpoint = mean(diamonds2$price))
Просто ответил на это для другой темы , но считаю, что это, возможно, более подходит для этой темы. Невозможно пометить ни один из них как дубликат, потому что ни один из них еще не получил принятого ответа. Вы можете создать псевдозаливку, нарисовав много сегментов. Вы можете получить их непосредственно из базовых данных в объекте ggplot_built.
Если вам нужен дополнительный контур многоугольника («граница»), вам нужно будет создать его по координатам x / y. Ниже один вариант.
library(tidyverse)
p <- ggplot(diamonds, aes(x=cut,y=carat)) + geom_violin()
mywidth <- .35 # bit of trial and error
# all you need for the gradient fill
vl_fill <- data.frame(ggplot_build(p)$data) %>%
mutate(xnew = x- mywidth*violinwidth, xend = x+ mywidth*violinwidth)
# the outline is a bit more convoluted, as the order matters
vl_poly <- vl_fill %>%
select(xnew, xend, y, group) %>%
pivot_longer(-c(y, group), names_to = "oldx", values_to = "x") %>%
arrange(y) %>%
split(., .$oldx) %>%
map(., function(x) {
if(all(x$oldx == "xnew")) x <- arrange(x, desc(y))
x
}) %>%
bind_rows()
ggplot() +
geom_polygon(data = vl_poly, aes(x, y, group = group),
color= "black", size = 1, fill = NA) +
geom_segment(data = vl_fill, aes(x = xnew, xend = xend, y = y, yend = y,
color = violinwidth))
Создано 14.04.2021 пакетом REPEX (v1.0.0)