Измените geom_point на градиентную фигуру / полигон - PullRequest
0 голосов
/ 25 октября 2018

Я изучаю, как меняется конкретный индекс.Индекс является мерой отношения между 10-м процентилем и 90-м процентилем по логарифмически измененной шкале.Чтобы исследовать индекс, я создал этот набор данных:

dt = 
  data_frame(p10 = sample(seq(0.1,1.25,0.05), replace = TRUE, 10000),
             p90 = sample(seq(0.25,1.75,0.05), replace = TRUE, 10000)) %>% 
  filter(p90 > p10) %>%
  mutate(p10 = log(p10), p90 = log(p90)) %>%
  mutate(index = p10/p90) %>%
  filter(abs(index) < 10) %>%
  select(index, p10, p90)
dt

Я строю набор данных, чтобы увидеть, как меняется индекс с изменяющимися логарифмическими процентилями.

dt %>%
  ggplot(aes(x = p10, y = p90)) +
  geom_point(aes(colour = index)) +

  geom_abline(colour = "black", size = 0.75) +
  geom_hline(colour = "black", yintercept = 0, size = 0.75) +
  geom_vline(colour = "black", xintercept = 0, size = 0.75) +

  scale_colour_distiller(type = "div", palette = 1) + 

  coord_equal() +
  xlim(-2.5,0.75) +
  ylim(-2.5,0.75) +
  theme_bw()

enter image description here

Этот график хорошо иллюстрирует мою точку зрения, но не идеален для презентации.Я надеялся, что смогу заменить точки многоугольником с градиентной заливкой.Однако выяснить, как это сделать, мне не по силам.Кроме того, я не уверен, возможно ли это сделать.Будет ли кто-то против того, чтобы ужасно указывать мне это в правильном направлении?Это высоко ценится!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы можете проверить функцию interp, чтобы увидеть, удовлетворяет ли она вашим потребностям:

library(akima)

# interpolate data
dt.interp <- interp(x = dt$p10, y = dt$p90, z = dt$index,
                    duplicate = "mean",
                    nx = 100, ny = 100) # set nx / ny based on how fine your want the polygons to be

# convert results back to a data frame
dt.interp <- data.frame(
  p10 = rep(dt.interp$x, times = length(dt.interp$y)),
  p90 = rep(dt.interp$y, each = length(dt.interp$x)),
  index = as.vector(dt.interp$z)
)

# plot results, replacing geom_point with geom_tile & color scale with fill scale
dt.interp %>%
  ggplot(aes(x = p10, y = p90)) +      
  geom_tile(aes(fill = index)) +      
  geom_abline(colour = "black", size = 0.75) +
  geom_hline(colour = "black", yintercept = 0, size = 0.75) +
  geom_vline(colour = "black", xintercept = 0, size = 0.75) +      
  scale_fill_distiller(type = "div", palette = 1) +       
  coord_equal() +
  xlim(-2.5,0.75) +
  ylim(-2.5,0.75) +
  theme_bw()

plot

(Серая область - NAзначения, потому что там не было точек, доступных для интерполяции. Вы можете запустить na.omit() на df.interp перед построением графика, если хотите скрыть их, или назначить им другой цвет.

0 голосов
/ 25 октября 2018

Вот пример, который преобразует точки в многоугольники и устанавливает цвета каждого из них.Я сомневаюсь, что это именно то, что вы хотите, но, возможно, это начало.

library(dplyr)
library(ggplot2)
library(sp)
library(rgeos)
dt = 
  data_frame(p10 = sample(seq(0.1,1.25,0.05), replace = TRUE, 10000),
             p90 = sample(seq(0.25,1.75,0.05), replace = TRUE, 10000)) %>% 
  filter(p90 > p10) %>%
  mutate(p10 = log(p10), p90 = log(p90)) %>%
  mutate(index = p10/p90) %>%
  filter(abs(index) < 10) %>%
  select(index, p10, p90)

dt.points = dt
coordinates(dt.points) = ~p10 + p90
dt.polygons = gBuffer(dt.points, width = 0.01, byid = T)

dt.polygons$colour = cut(dt$index, breaks = 10, labels = F)

plot(dt.polygons, col=dt.polygons$colour)
...