gpt4 book ai didi

r - 使用转换后的颜色/填充变量 ggplot2 为 scale_*_gradientn 指定手动值

转载 作者:行者123 更新时间:2023-12-04 03:14:54 27 4
gpt4 key购买 nike

我正在尝试为我的一个绘图中的颜色创建一个手动比例。我的数据范围从 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)))

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

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

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

最佳答案

您只指定了 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

关于r - 使用转换后的颜色/填充变量 ggplot2 为 scale_*_gradientn 指定手动值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41985921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com