Frage an ggplot2, r – ändere die Standard-Farbpalette in ggplot

20

Ich habe eine Funktion geschrieben, die einen Vektor mit Farbnamen zurückgibt:

<code>custom.colors <- function(n) {
  palette <- c("dodgerblue1", "skyblue4", "chocolate1", "seagreen4",
               "bisque3", "red4", "purple4", "mediumpurple3",
               "maroon", "dodgerblue4", "skyblue2", "darkcyan",
               "darkslategray3", "lightgreen", "bisque",
               "palevioletred1", "black", "gray79", "lightsalmon4",
               "darkgoldenrod1")
  if (n > length(palette))
    warning('palette has duplicated colours')
  rep(palette, length.out=n)
}
</code>

Ich möchte, dass ggplot die obige Funktion verwendet, um die Palette standardmäßig zu generieren. Vielleicht nur für diskrete Skalen. Verwendenscale_manual() Jedes Mal ist zu viel anstrengend. Ist es möglich?

dieser Beitrag sollte nützlich sein. baptiste
Vielen Dank. Ich werde das für später behalten, aber jetzt bin ich mit Version 0.8.9 fest. Ernest A

Deine Antwort

3   die antwort
18

Um die Standardfarbskala neu zu definieren, können Sie auch einfach die neu definierenggplot Funktion:

<code>ggplot <- function(...) ggplot2::ggplot(...) + scale_color_brewer(palette="Spectral")
</code>

Gleiches gilt für die Füllskala.

Einfach und schön. Peque
Dies kann zu Problemen führen, wenn Sie der Farbe eine kontinuierliche Variable zuordnen baptiste
7

@baptiste hat mich auf einen Beitrag im Message Board hingewiesen, in dem die Funktion erwähnt wirdset_default_scale Hiermit kann eine Standardpalette festgelegt werden. Die folgende Lösung funktioniert jedoch nur mit alten Versionen von ggplot2.

Zuerst brauchen wir eine Funktion, die Farbnamen oder -codes erzeugt. Ich habe meine angerufenmagazine.colours:

<code>magazine.colours <- function(n, set=NULL) {
  set <- match.arg(set, c('1', '2'))
  palette <- c("red4", "darkslategray3", "dodgerblue1", "darkcyan",
               "gray79", "black", "skyblue2", "dodgerblue4",
               "purple4", "maroon", "chocolate1", "bisque3", "bisque",
               "seagreen4", "lightgreen", "skyblue4", "mediumpurple3",
               "palevioletred1", "lightsalmon4", "darkgoldenrod1")
  if (set == 2)
    palette <- rev(palette)
  if (n > length(palette))
    warning('generated palette has duplicated colours')
  rep(palette, length.out=n)
}
</code>

(Es akzeptiert eine optionaleset Argument, um zu zeigen, dass Sie nicht auf eine einzelne Palette beschränkt sind.) Ok, jetzt erstellen wir eine "Skala", die ich aufgerufen habemagazine. Es basiert auf der Brauerskala von ggplot und der Code ist ziemlich hässlich:

<code>ScaleMagazine <- proto(ScaleColour, expr={
  objname <- 'magazine'
  new <- function(., name=NULL, set=NULL, na.colour='yellowgreen',
                  limits=NULL, breaks = NULL, labels=NULL,
                  formatter = identity, variable, legend = TRUE) {
    b_and_l <- check_breaks_and_labels(breaks, labels)
    .$proto(name=name, set=set, .input=variable, .output=variable,
            .labels = b_and_l$labels, breaks = b_and_l$breaks,
            limits= limits, formatter = formatter, legend = legend,
            na.colour = na.colour)
  }
  output_set <- function(.) {
    missing <- is.na(.$input_set())
    n <- sum(!missing)
    palette <- magazine.colours(n, .$set)
    missing_colour(palette, missing, .$na.colour)
  }
  max_levels <- function(.) Inf
})
scale_colour_magazine <- ScaleMagazine$build_accessor(list(variable = '"colour"'))
scale_fill_magazine <- ScaleMagazine$build_accessor(list(variable = '"fill"'))
</code>

Das Wichtigste hier ist zu definierenoutput_set Dies ist die Funktion, die ggplot aufruft, um die Farbnamen / -codes abzurufen. Wenn Sie zusätzliche Argumente benötigen, müssen diese ebenfalls in enthalten seinnew und später kann zugegriffen werden als.$argument_name. Im obigen Beispieloutput_set ruft einfach anmagazine.colours.

Überprüfen Sie nun, ob die neue Skala tatsächlich funktioniert:

<code>qplot(mpg, wt, data=mtcars, shape=21,
      colour=factor(carb), fill=factor(carb)) +
  scale_colour_magazine(set='1') +
  scale_fill_magazine(set='1')
</code>

Um es zum Standard zu machen, verwenden Sie einfachset_default_scale.

<code>set_default_scale("colour", "discrete", "magazine") 
set_default_scale("fill", "discrete", "magazine") 
</code>

Und das wird es sein.

<code>> qplot(mpg, wt, data=mtcars, colour=factor(carb), fill=factor(carb))
</code>

4

Weisen Sie einfach eine Variable mit dem Namen Ihrer gewünschten Skala zu:

<code>scale_colour_discrete <- function(...)
  scale_colour_manual(..., values = c('dodgerblue1', *))
</code>

Dies funktioniert, da ggplot seine Standardskalen nach Möglichkeit aus der globalen Umgebung übernimmt, ähnlich wie:

<code>get('scale_colour_discrete', envir = globalenv())
</code>
Ich konnte es nicht zum Laufen bringen. Könnten Sie ein funktionierendes Beispiel geben? Sebastian Sauer
In einer interaktiven R-Sitzung müssen Sie je nachdem, ob Sie eine Skala für diskrete oder kontinuierliche Werte verwenden möchten, und je nachdem, ob Sie diese für Farbe oder Füllung verwenden möchten, eine Variable mit dem Namen definierenscale_{colour,fill}_{discrete,continuous}, z.B.scale_colour_discrete <- scale_colour_viridis_d; ggplot(iris, aes(Sepal.Length, Sepal.Width, colour = Species)) + geom_point() flying sheep

Verwandte Fragen