使用已转换的颜色/填充变量ggplot2

时间:2017-02-01 17:26:39

标签: r ggplot2

我正在尝试为我的一个地块中的颜色创建手动缩放。我的数据从0到10,我有很多非常小的数字。重要的是,我想要两个颜色渐变。一个值为< 1,一个值为> = 1的点。因为我有相当多的非常小的数字,我想让颜色梯度在对数刻度上(发散在1)。

模拟数据:

library(cowplot)
df <- data_frame(xs = rnorm(1000), 
                 ys = rnorm(1000),
                 color_vals =c(runif(500, 0,.001), runif(500, .01,10)))

我知道我可以像这样自动执行此操作(我知道有一个白点没有意义,但这只是我更复杂的地图的一个玩具示例):

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() +
       scale_color_gradient2(low="blue", high = "red", mid = "white", trans="log10")

enter image description here

我不想要这种类型的渐变,因为我想要两个渐增的渐变,分为1:(1)从灰色到蓝色,(2)从黄色到红色。

我知道我可以用scale_color_gradientn这样指定:

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() +
       scale_color_gradientn(colors = c("grey", "blue", "yellow", "red"),
                             values = scales::rescale(c(0,1,1.000001, max(df$colors))))

enter image description here

但是当我尝试与对数变换一起执行此操作时,渐变效果并不正确。

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() +
       scale_color_gradientn(trans = "log10",
                             colors = c("grey", "blue", "yellow", "red"),
                             values = scales::rescale(c(0.000001,1,1.000001, max(df$colors))))

enter image description here

我得到的最接近的是尝试对rescale内的数字进行对数转换,但这不能正常工作(虽然它已经接近)。

ggplot(df, aes(x=xs, y=ys, color=color_vals)) + geom_point() +
       scale_color_gradientn(trans = "log10",
                             colors = c("grey", "blue", "yellow", "red"),
                             values = scales::rescale(log10(c(0.000001,1,1.000001, max(df$colors)))))

enter image description here

那么如果我还想对渐变进行对数转换,如何为两个渐变指定正确的值呢?

1 个答案:

答案 0 :(得分:1)

您只指定了2种颜色的限制,但是您有4种颜色。它需要每种颜色的起点和终点。请尝试以下方法。您可以根据所需的起点/终点来更改参数:

 ggplot(df, aes(x = xs, y = ys, color = color_vals)) + 
 geom_point() +
 scale_color_gradientn(trans = "log10",
                    colors = c("grey", "blue", "yellow", "red"),
                    values = scales::rescale(log10(
                      c(0, 1, #grey parameters
                        1.000001, 2, #blue parameters
                        2.1, 3, #yellow parameters
                        3.1, max(df$color_vals))))) #red parameters

由于您提到您只想绘制2种颜色,您将删除两个中间值参数,并删除两个颜色选项,如下所示:

  ggplot(df, aes(x = xs, y=ys, color = color_vals)) + 
  geom_point() +
  scale_color_gradientn(trans = "log10",
                    colors = c("blue", "pink"),
                    values = scales::rescale(log10(
                      c(min(df$color_vals), 1,  # <1 (blue) parameters
                        1, max(df$color_vals))))) # >1 (pink) parameters