Wie wird eine 2-D-Farbskala (Farbton x Luminanz) implementiert?

Hier ist ein Spielzeugdata.frame das illustriert das Problem (die grundlegendste Version davon, das heißt, es wird später eine zusätzliche Falte geben):

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)

ch möchte ein Streudiagramm dieser Daten erstellen, in dem das Toxin durch den Farbton der Punkte und die Dosis durch ihre Leuchtdichte angezeigt wird (in erster Näherung sollte eine niedrige Dosis einer hohen Leuchtdichte entsprechen

er besonders herausfordernde Aspekt dieses Visualisierungsproblems ist, dass die Legende eine zweidimensionale Farbe sein musGitte (anstelle einer eindimensionalen FarbeBa), wobei die Zeilen dem @ entsprechtoxin Variable und die Spalten, die @ entsprechdose (oder eine Transformation davon).

Die zusätzliche Falte, auf die ich oben angespielt habe, ist, dass die Daten tatsächlich eine Kontrollbeobachtung enthalten, bei der die Dosis von allen anderen verschieden ist (siehe Zeile mit Toxin = "Z" unten):

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)

Der Punkt für das Kontrolltoxin ("Z") sollte ein einzelner grauer Punkt sein. (Es ist in Ordnung, wenn die zweidimensionale Farbrasterlegende den Steuerwert nicht enthält. In diesem Fall sollte jedoch mindestens eine Legende vorhanden sein, die den entsprechenden Punkt identifiziert.)

usammenfassend besteht das Problem aus drei Teile

Stellen Sie Toxin und Dosis nach Farbton bzw. Luminanz dar.Erstelle eine 2-D-Farbrasterlegende.Legends sollte den Kontrollpunkt identifizieren.

Below ist das, was ich bisher geschafft habe.

Der einzige Weg, den ich mir vorstellen kann, um den ersten Aspekt des Problems zu lösen, besteht darin, jedem Toxin eine andere Schicht zuzuweisen und einen Farbverlauf zu verwenden, der auf der Dosis basiert.

Leider scheint es keine Möglichkeit zu geben, für jede Ebene eine andere Verlaufsskala festzulegen.

m Einzelnen definiere ich zunächst Folgendes:

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))

Die erste Schicht selbst sieht vielversprechend aus:

(
 baseplot
          + geom_point(data = subset(df, toxin == "A"), size = 4)
          + gradient(1)
)

Aber wenn ich die zweite Ebene hinzufüge ...

(
 baseplot
          + geom_point(data = subset(df, toxin == "A"), size = 4)
          + gradient(1)
          + geom_point(data = subset(df, toxin == "B"), size = 4)
          + gradient(2)
)

... ich bekomme folgende Warnung:

Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.

Und das ist die Handlung, die ich bekomme:

Ich habe keine Möglichkeit gefunden, verschiedene Ebenen mit einer eigenen Farbskala zu definieren.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage