Как @alistaire, мне казалось, что geom_tile
плитка границы должна подчиняться alpha
отображения, но они не кажутся. В качестве обходного пути вы можете использовать geom_segment
для рисования сегментов линии в тех же местах, где должны быть границы. Эти сегменты подчиняются картированию alpha
.
В приведенном ниже коде мы сначала создаем новый фрейм данных segs
для рисования сегментов. Мы могли бы использовать исходные данные, но это короткие строки и один столбец.
library(dplyr)
segs = expand.grid(x=(min(volcano3d$x)-1):max(volcano3d$x),
y=(min(volcano3d$y)-1):max(volcano3d$y)) %>%
left_join(volcano3d)
Чтобы добавить сегменты к сюжету, нам нужно сортировать каждый раз, чтобы получить й и у значения в правильном порядке для, соответственно, вертикальных или горизонтальных сегментов. Мы также используем colour="#FFFFFF00"
в geom_tile
, чтобы удалить границу плитки по умолчанию.
ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) +
geom_tile(colour="#FFFFFF00", aes(x, y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2)
На приведенном ниже рисунке вы можете увидеть границы плитки, но они исчезают вместе с плитами. Границы немного темнее, потому что они нарисованы поверх плиток, что приводит к примерно удвоенной непрозрачности плиток.
Если вы хотите, чтобы плитка границы менее заметным, вы можете свернуть их alpha
значения относительно плитки значений альфа.
ggplot(volcano3d, aes(fill=z, colour=z)) +
geom_tile(colour="#FFFFFF00", aes(x, y, alpha=y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5, alpha=0.2*y), size=0.2) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5, alpha=0.2*y), size=0.2)
Чтобы убедиться в том, что сегменты имитируя плитку цвета и альфа-значение, вы можете удалить плитки и сюжетные толстые линии:
ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) +
#geom_tile(colour="#FFFFFF00", aes(x, y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=1.5) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=1.5)
Вот версия с расходящимся градиентом цвета, что создает большую контрастность в диапазоне z
значения:
ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) +
geom_tile(colour="#FFFFFF00", aes(x, y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2) +
scale_fill_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z))) +
scale_colour_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z)))
Похоже, вы должны быть в состоянии сделать это с чем-то вроде 'scale_color_gradient (Low = '# 00000000', высокий = 'Hotpink')', но, к сожалению, игнорирует (хотя он принимает его ...) - может быть, проблема с цветовым пространством. – alistaire
Вы бы так подумали, но я также обнаружил, что нет эффекта указания альфы в scale_color_gradient(). Кажется, что для цвета и заливки должна быть отдельная альфа. – pthomp
Alpha - это его собственная эстетика, поэтому «scale_alpha_continuous» существует. Но да, для 'geom_tile', это влияет только на заполнение, а не на удар.Подход «scale_color_gradient» немного взломан, но похоже, что он терпит неудачу из-за базовой обработки цвета. Возможно, проблема GitHub может быть здесь, если она правильно собрана, хотя она может быть отклонена как слишком большая работа. – alistaire