我正在尝试为我的一个地块中的颜色创建手动缩放。我的数据从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")
我不想要这种类型的渐变,因为我想要两个渐增的渐变,分为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))))
但是当我尝试与对数变换一起执行此操作时,渐变效果并不正确。
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))))
我得到的最接近的是尝试对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)))))
那么如果我还想对渐变进行对数转换,如何为两个渐变指定正确的值呢?
答案 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