【发布时间】:2016-08-19 14:42:11
【问题描述】:
这是一个说明问题的玩具data.frame(它的最基本版本,即;稍后会有额外的皱纹):
df <- read.table(textConnection(
"toxin dose x y
A 1 0.851 0.312
A 10 0.268 0.443
A 100 0.272 0.648
B 1 0.981 0.015
B 10 0.304 0.658
B 100 0.704 0.821
C 1 0.330 0.265
C 10 0.803 0.167
C 100 0.433 0.003
D 1 0.154 0.611
D 10 0.769 0.616
D 100 0.643 0.541
"), header = TRUE)
我想制作这些数据的散点图,其中毒素由点的色调表示,剂量由它们的亮度表示(第一个近似值,低剂量应该对应于高亮度)。
这个可视化问题特别具有挑战性的方面是图例必须是二维颜色grid(而不是一维颜色bar),与toxin 变量对应的行和与dose 对应的列(或其转换)。
我上面提到的额外皱纹是数据实际上包括一个对照观察,其中剂量与所有其他观察不同(注意下面带有 toxin = "Z" 的行):
df <- read.table(textConnection(
"toxin dose x y
A 1 0.851 0.312
A 10 0.268 0.443
A 100 0.272 0.648
B 1 0.981 0.015
B 10 0.304 0.658
B 100 0.704 0.821
C 1 0.330 0.265
C 10 0.803 0.167
C 100 0.433 0.003
D 1 0.154 0.611
D 10 0.769 0.616
D 100 0.643 0.541
Z 0.001 0.309 0.183
"), header = TRUE)
控制(“Z”)毒素的点应该是一个灰色的点。 (如果二维彩色网格图例不包含控制值也没关系,但在这种情况下,应该至少有一个图例可以适当地标识其点。)
总结起来,问题分为三个部分:
- 分别用色调和亮度表示毒素和剂量。
- 制作二维彩色网格图例。
- 图例应确定控制点。
以下是我到目前为止所管理的。
我能想到的解决问题的第一个方面的唯一方法是为每种毒素分配不同的层,并根据剂量使用颜色渐变。
不幸的是,似乎没有办法为每一层指定不同的渐变比例。
更具体地说,我首先定义以下内容:
library(ggplot2)
hues <- RColorBrewer::brewer.pal(4, "Set1")
gradient <- function (hue_index) {
scale_color_gradient(high = hues[hue_index],
low = "white",
trans = "log",
limits = c(0.1, 100),
breaks = c(1, 10, 100))
}
baseplot <- ggplot(mapping = aes(x = x, y = y, color = dose))
第一层本身看起来很有希望:
(
baseplot
+ geom_point(data = subset(df, toxin == "A"), size = 4)
+ gradient(1)
)
但是当我添加第二层时...
(
baseplot
+ geom_point(data = subset(df, toxin == "A"), size = 4)
+ gradient(1)
+ geom_point(data = subset(df, toxin == "B"), size = 4)
+ gradient(2)
)
...我收到以下警告:
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
而且,果然,这是我得到的情节:
我还没有找到一种方法来定义不同的图层,每个图层都有自己的色阶。
【问题讨论】:
-
您的问题似乎有点类似于this question,解决方法是同时使用
color和fill来获得两种不同的配色方案。 -
This question/answer 为每组不同颜色渐变的问题提供了另一种解决方案,尽管它可能没有图例。