Вы можете разбить вашу непрерывную переменную z
на дискретную переменную, используя cut
и определенные вручную разрывы, а затем присвоить ей расходящуюся цветовую шкалу, либо вручную, либо с помощью предварительно определенной палитры.
Единственная сложная часть - очистка меток, которую я сделал с помощью шаблона регулярных выражений, чтобы извлечь последнее число из каждого диапазона.Технически эти метки не совсем точны, потому что каждый цвет представляет диапазон значений, а не просто одно значение, но я пытался подражать вашему примеру.Вы можете пропустить функцию маркировки, которую я вставил в scale_color_brewer
, и просто использовать метки по мере их поступления, которые имеют формат (0,2, 0,4].
library(tidyverse)
a = data.frame(x=c(1,2,3,3,4,5,3,2,3,4),
y=c(1,2,3,6,4,5,3,2,3,2),
z=c(-4,-3.5,-2,-1,0,0.2,0.45,0.6,0.9,1))
a$brk <- cut(a$z, breaks = c(-6:0, seq(0.2, 1, by = 0.2)), include.lowest = T)
ggplot(a, aes(x = x, y = y, fill = brk)) +
geom_point(shape = 21, size = 3, stroke = 0.1, color = "black") +
scale_fill_brewer(palette = "RdBu",
guide = guide_legend(reverse = T),
direction = -1, drop = F,
labels = function(x) str_extract(x, "(?<=,).+(?=\\])"))
Одна проблема заключается в том, что это дает легенду с кругами в ней, потому что она принимает форму geom_point
. Я возился с добавлением guide = guide_legend(override.aes = list(shape = 22))
и других фигур, чтобы вместо этого сделать квадраты, но хотел, чтобы это выглядело больше как обычныйЛегенда. Вы получаете более традиционную легенду из заполнения geom_col
, поэтому я использовал трюк, который я взял из этого ответа , чтобы сделать невидимым geom_col
, и отключил легенду дляgeom_point
и использовать только легенду, созданную geom_col
.
ggplot(a, aes(x = x, y = y)) +
geom_point(aes(fill = brk), shape = 21, size = 3, stroke = 0.1, color = "black", show.legend = F) +
geom_col(aes(fill = brk), alpha = 0) +
scale_fill_brewer(palette = "RdBu",
guide = guide_legend(reverse = T, override.aes = list(alpha = 1)),
direction = -1, drop = F,
labels = function(x) str_extract(x, "(?<=,).+(?=\\])"))
Создано в 2018-05-25 пакетом contex (v0.2.0).