Вот игрушка 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)
Я хочу сделать диаграмму рассеяния этих данных, на которой токсин обозначен оттенком точек, а доза обозначена их яркостью (в первом приближении низкая доза должна соответствовать высокой яркости).
Особенно сложным аспектом этой проблемы визуализации является то, что легенда должна быть двухмерной цветной сеткой (а не одномерной цветной полосой 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.
И, конечно же, вот сюжет, который я получаю:
Мне не удалось найти способ определить разные слои, каждый со своей собственной цветовой шкалой.
color
иfill
, чтобы получить две разные цветовые схемы. - person aosmith   schedule 19.08.2016