簡體   English   中英

線ggplot2周圍的緩沖區

[英]buffer areas around lines ggplot2

我想要一張圖表,作為一年中某一天的函數,在x和y軸上從0 - > 100%前進(其中每個軸是一個單獨的度量)。 根據數據相對於一年中的哪一天,我想表明這是好還是壞。 很簡單,我可以這樣顯示: 在此輸入圖像描述

所以上面的情節顯示我們處於良好的狀態,因為“小費”(最黑暗的最大點)超過了50%的標記(假設我們全年都是50%)。 但我想在水平線和垂直線周圍添加漸變線以顯示更多細微差別。 這是對區域的解釋(第一張圖是解釋......第二張圖是我想在ggplot中顯示的方式......區域完全填滿。

在此輸入圖像描述

這是我在ggplot中走了多遠:

在此輸入圖像描述

我遇到的問題:

  1. 由於某種原因,垂直漸變不接受alpha參數
  2. 我不能分配兩個不同的漸變,一旦我定義了漸變,它就適用於垂直和水平漸變。
  3. 這看起來很可怕。 我應該遵循更好的方法嗎?

問題1-2是否可以解決? 如果有人有更好的方法不使用geom_line ,請隨時建議方法。

編輯:當線條移動時,漸變也會移動,因此靜態背景在這里不起作用。

代碼如下:

dff <- data.frame(x = 1:60+(runif(n = 60,-2,2)),
                  y = 1:60+(runif(n = 60,-2,2)),
                  z = 1:60)

dfgrad <- data.frame(static = c(rep(50,1000)), line = seq(0,100,length.out=100))

## To see the gradientlines thinner, change the size on the geom_line  to like 200

ggplot(dff,aes(x,y)) +
  geom_line(data = dfgrad, aes(x=static, y=line, color=line),size=1000,alpha=0.5) +
  geom_line(data = dfgrad, aes(x=line, y=static, color=line),size=1000,alpha=0.5) +
  scale_colour_gradientn( colours = c( "yellow", "darkgreen","darkred"),
                          breaks  = c( 0, 3, 100),
                          limits  = c( 0,100)) +
  geom_hline(yintercept = 50, linetype="dashed") +
  geom_vline(xintercept = 50, linetype="dashed") +
  geom_point(aes(alpha=dff$z,size= (dff$z))) +
  theme(legend.position="none") +
  scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))

最終編輯:提交的答案是正確的,但為了根據“今天”行更改漸變,我不得不更多地混淆它...所以我將它粘貼在這里以防它對任何人都有用:

g1 <- colorRampPalette(c("darkgreen", "darkgreen","red"))(20) %>%
  alpha(0.3) %>% matrix(ncol=1) %>%  # up and down gradient
  rasterGrob(width = 1, height = 1)  # full-size (control it by ggplot2)

g2 <- colorRampPalette(c("yellow", "darkgreen","red"))(20) %>% 
  alpha(0.3) %>% matrix(nrow=1) %>%  # left and right gradient
  rasterGrob(width = 1, height = 1)

timeOfYear <- 5
maxx <- max(timeOfYear,(100-timeOfYear))

ggplot(dff,aes(x,y)) +
  annotation_custom(g1, xmin = timeOfYear-maxx, xmax = timeOfYear+maxx, ymin = timeOfYear-maxx, ymax = timeOfYear+maxx) +
  annotation_custom(g2, xmin = timeOfYear-maxx, xmax = timeOfYear+maxx, ymin = timeOfYear-maxx, ymax = timeOfYear+maxx) +
  # annotation_custom(g1, xmin = 35, xmax = 65, ymin = -3, ymax = 100) +
  # annotation_custom(g2, xmin = -3, xmax = 100, ymin = 35, ymax = 65) +
  geom_hline(yintercept = timeOfYear, linetype="dashed") +
  geom_vline(xintercept = timeOfYear, linetype="dashed") +
  geom_point(aes(alpha=dff$z,size= (dff$z))) +
  theme(legend.position="none") +
  coord_cartesian(xlim = c(0, 100), ylim = c(0, 100), expand = F)

如果我是你,我會通過grid包制作矩形, grid使用annotation_custom()將它們放在圖表上。 (你的問題1是由於重疊,嘗試alpha=0.05

這是我的例子:

library(ggplot2); library(grid); library(dplyr)

g1 <- colorRampPalette(c("yellow", "darkgreen","darkred"))(20) %>%
  alpha(0.5) %>% matrix(ncol = 1) %>%   # up and down gradient
  rasterGrob(width = 1, height = 1)     # full-size (control it by ggplot2)

g2 <- colorRampPalette(c("cyan", "darkgreen","darkblue"))(20) %>% 
  alpha(0.5) %>% matrix(nrow = 1) %>%   # left and right gradient
  rasterGrob(width = 1, height = 1)

ggplot(dff,aes(x,y)) +
  annotation_custom(g1, xmin = 35, xmax = 65, ymin = -3, ymax = 100) + 
  annotation_custom(g2, xmin = -3, xmax = 100, ymin = 35, ymax = 65) + 
  geom_hline(yintercept = 50, linetype="dashed") +
  geom_vline(xintercept = 50, linetype="dashed") +
  geom_point(aes(alpha=dff$z,size= (dff$z))) +
  theme(legend.position="none") +
  coord_cartesian(xlim = c(-3, 100), ylim = c(-3, 100), expand = F)

在此輸入圖像描述

[EDITED]

這是我每次使用相同程度的漸變的方法(我指的是@Amit Kohli的代碼)(左圖是概念);

 # I added both limits colors as outside colors 
 # to avoid that graph becomes almost green when timeOfYear is about 50.
g1.2 <- c(rep("yellow", 5), colorRampPalette(c("yellow", "darkgreen","red"))(20), rep("red", 5)) %>%
  rev() %>% alpha(0.3) %>% matrix(ncol=1) %>% rasterGrob(width = 1, height = 1)

g2.2 <- c(rep("yellow", 5), colorRampPalette(c("yellow", "darkgreen","red"))(20), rep("red", 5)) %>%
  alpha(0.3) %>% matrix(nrow=1) %>% rasterGrob(width = 1, height = 1)

timeOfYear <- 5

ggplot(dff, aes(x, y)) +
  annotation_custom(g1.2, timeOfYear - 100, timeOfYear + 100, timeOfYear - 100, timeOfYear + 100) +
  annotation_custom(g2.2, timeOfYear - 100, timeOfYear + 100, timeOfYear - 100, timeOfYear + 100) + 
  geom_hline(yintercept = timeOfYear, linetype="dashed") +
  geom_vline(xintercept = timeOfYear, linetype="dashed") +
  geom_point(aes(alpha=dff$z,size= (dff$z))) +
  theme(legend.position="none") +
  coord_cartesian(xlim = c(0, 100), ylim = c(0, 100), expand = F)

在此輸入圖像描述 在此輸入圖像描述

如果需要, SpaDES::divergentColors()會為您提供一個具有非對稱范圍的顏色向量(可能某些包具有類似的功能)。

library(SpaDES)

timeOfYear <- 5

# ?divergentColors(start.color, end.color, min.value, max.value, mid.value = 0, mid.color = "white")    
   # It makes a vector of colors (length: max.value - min.value) 
   # and you can define mid.color's val (i.e., position)

g3 <- divergentColors("yellow", "red", 0, 100, timeOfYear, mid.color = "darkgreen") %>% 
  rev() %>% alpha(0.3) %>% matrix(ncol = 1) %>% rasterGrob(width = 1, height = 1)

g4 <- divergentColors("yellow", "red", 0, 100, timeOfYear, mid.color = "darkgreen") %>% 
  alpha(0.3) %>% matrix(nrow = 1) %>% rasterGrob(width = 1, height = 1)

ggplot(dff,aes(x,y)) +
  annotation_custom(g3, xmin = 0, xmax = 100, ymin = 0, ymax = 90) +
  annotation_custom(g4, xmin = 0, xmax = 90, ymin = 0, ymax = 100) + 
  geom_hline(yintercept = timeOfYear, linetype="dashed") +
  geom_vline(xintercept = timeOfYear, linetype="dashed") +
  geom_point(aes(alpha=dff$z,size= (dff$z))) +
  theme(legend.position="none") +
  coord_cartesian(xlim = c(0, 100), ylim = c(0, 100), expand = F)

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM