wake-up-neo.com

Wie füge ich Farben hinzu, um Farben in ggplot2 zu füllen?

Ich verwende derzeit scale_brewer() für das Füllen, und diese sehen in Farbe schön aus (auf dem Bildschirm und über Farbdrucker), drucken jedoch bei Verwendung eines Schwarzweißdruckers relativ gleichmäßig als Graustufen. Ich habe die Online-ggplot2-Dokumentation durchsucht, aber nichts über das Hinzufügen von Texturen zu Füllfarben gefunden. Gibt es einen offiziellen ggplot2-Weg, um dies zu tun, oder hat jemand einen Hack, den er benutzt? Mit Texturen meine ich Dinge wie diagonale Balken, umgekehrte diagonale Balken, Punktmuster usw., die Füllfarben unterscheiden, wenn sie in Schwarzweiß gedruckt werden.

76
rhh

ggplot kann Colorbrewer-Paletten verwenden. Einige davon sind "fotokopierfreundlich". Mabe so etwas wird für dich funktionieren?

ggplot(diamonds, aes(x=cut, y=price, group=cut))+
geom_boxplot(aes(fill=cut))+scale_fill_brewer(palette="OrRd")

in diesem Fall ist OrRd eine Palette auf der Colorbrewer-Webseite: http://colorbrewer2.org/

Fotokopiefreundlich: Zeigt an, dass dass ein gegebenes Farbschema widerstehen schwarz und weiß Fotokopieren. Abweichende Schemata können nicht erfolgreich fotokopiert werden. Unterschiede in der Helligkeit sollten .__ sein. mit sequentiellen Schemata erhalten.

33
Andreas

Hey Leute, hier ist ein kleiner Hack, der das Texturproblem auf eine sehr einfache Art und Weise anspricht:

ggplot2: Mit R wird der Rand eines Balkens dunkler als der andere.

EDIT: Ich habe endlich Zeit gefunden, ein kurzes Beispiel für diesen Hack zu geben, der in ggplot2 mindestens drei Arten von Grundmustern erlaubt. Der Code:

Example.Data<- data.frame(matrix(vector(), 0, 3, dimnames=list(c(), c("Value", "Variable", "Fill"))), stringsAsFactors=F)

Example.Data[1, ] <- c(45, 'Horizontal Pattern','Horizontal Pattern' )
Example.Data[2, ] <- c(65, 'Vertical Pattern','Vertical Pattern' )
Example.Data[3, ] <- c(89, 'Mesh Pattern','Mesh Pattern' )


HighlightDataVert<-Example.Data[2, ]
HighlightHorizontal<-Example.Data[1, ]
HighlightMesh<-Example.Data[3, ]
HighlightHorizontal$Value<-as.numeric(HighlightHorizontal$Value)
Example.Data$Value<-as.numeric(Example.Data$Value)

HighlightDataVert$Value<-as.numeric(HighlightDataVert$Value)
HighlightMesh$Value<-as.numeric(HighlightMesh$Value)
HighlightHorizontal$Value<-HighlightHorizontal$Value-5
HighlightHorizontal2<-HighlightHorizontal
HighlightHorizontal2$Value<-HighlightHorizontal$Value-5
HighlightHorizontal3<-HighlightHorizontal2
HighlightHorizontal3$Value<-HighlightHorizontal2$Value-5
HighlightHorizontal4<-HighlightHorizontal3
HighlightHorizontal4$Value<-HighlightHorizontal3$Value-5
HighlightHorizontal5<-HighlightHorizontal4
HighlightHorizontal5$Value<-HighlightHorizontal4$Value-5
HighlightHorizontal6<-HighlightHorizontal5
HighlightHorizontal6$Value<-HighlightHorizontal5$Value-5
HighlightHorizontal7<-HighlightHorizontal6
HighlightHorizontal7$Value<-HighlightHorizontal6$Value-5
HighlightHorizontal8<-HighlightHorizontal7
HighlightHorizontal8$Value<-HighlightHorizontal7$Value-5

HighlightMeshHoriz<-HighlightMesh
HighlightMeshHoriz$Value<-HighlightMeshHoriz$Value-5
HighlightMeshHoriz2<-HighlightMeshHoriz
HighlightMeshHoriz2$Value<-HighlightMeshHoriz2$Value-5
HighlightMeshHoriz3<-HighlightMeshHoriz2
HighlightMeshHoriz3$Value<-HighlightMeshHoriz3$Value-5
HighlightMeshHoriz4<-HighlightMeshHoriz3
HighlightMeshHoriz4$Value<-HighlightMeshHoriz4$Value-5
HighlightMeshHoriz5<-HighlightMeshHoriz4
HighlightMeshHoriz5$Value<-HighlightMeshHoriz5$Value-5
HighlightMeshHoriz6<-HighlightMeshHoriz5
HighlightMeshHoriz6$Value<-HighlightMeshHoriz6$Value-5
HighlightMeshHoriz7<-HighlightMeshHoriz6
HighlightMeshHoriz7$Value<-HighlightMeshHoriz7$Value-5
HighlightMeshHoriz8<-HighlightMeshHoriz7
HighlightMeshHoriz8$Value<-HighlightMeshHoriz8$Value-5
HighlightMeshHoriz9<-HighlightMeshHoriz8
HighlightMeshHoriz9$Value<-HighlightMeshHoriz9$Value-5
HighlightMeshHoriz10<-HighlightMeshHoriz9
HighlightMeshHoriz10$Value<-HighlightMeshHoriz10$Value-5
HighlightMeshHoriz11<-HighlightMeshHoriz10
HighlightMeshHoriz11$Value<-HighlightMeshHoriz11$Value-5
HighlightMeshHoriz12<-HighlightMeshHoriz11
HighlightMeshHoriz12$Value<-HighlightMeshHoriz12$Value-5
HighlightMeshHoriz13<-HighlightMeshHoriz12
HighlightMeshHoriz13$Value<-HighlightMeshHoriz13$Value-5
HighlightMeshHoriz14<-HighlightMeshHoriz13
HighlightMeshHoriz14$Value<-HighlightMeshHoriz14$Value-5
HighlightMeshHoriz15<-HighlightMeshHoriz14
HighlightMeshHoriz15$Value<-HighlightMeshHoriz15$Value-5
HighlightMeshHoriz16<-HighlightMeshHoriz15
HighlightMeshHoriz16$Value<-HighlightMeshHoriz16$Value-5
HighlightMeshHoriz17<-HighlightMeshHoriz16
HighlightMeshHoriz17$Value<-HighlightMeshHoriz17$Value-5

ggplot(Example.Data, aes(x=Variable, y=Value, fill=Fill)) + theme_bw() + #facet_wrap(~Product, nrow=1)+ #Ensure theme_bw are there to create borders
  theme(legend.position = "none")+
  scale_fill_grey(start=.4)+
  #scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))+
  geom_bar(position=position_dodge(.9), stat="identity", colour="black", legend = FALSE)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+
geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+  
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0) +
  geom_bar(data=HighlightHorizontal, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal2, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal3, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal4, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal5, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal6, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal7, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal8, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+
 geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0)+
  geom_bar(data=HighlightMeshHoriz, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
geom_bar(data=HighlightMeshHoriz2, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz3, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz4, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz5, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz6, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz7, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz8, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz9, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz10, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz11, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz12, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz13, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz14, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz15, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz16, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz17, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")

Produziert das:

enter image description here

Es ist nicht super hübsch, aber es ist die einzige Lösung, an die ich denken kann.

Wie man sehen kann, produziere ich einige sehr grundlegende Daten. Um die vertikalen Linien zu erhalten, erstelle ich einfach einen Datenrahmen, der die Variable enthält, in die vertikale Linien eingefügt werden sollen, und die Diagrammgrenzen mehrmals umgeformt, wobei die Breite jedes Mal reduziert wird.

Ähnliches gilt für die horizontalen Linien, es ist jedoch für jede Neuzeichnung ein neuer Datenrahmen erforderlich, bei dem ich einen Wert (in meinem Beispiel '5') von dem mit der interessierenden Variablen verknüpften Wert abgezogen habe. Die Höhe der Stange effektiv senken. Dies ist umständlich zu erreichen, und es gibt möglicherweise schlankere Ansätze, aber dies veranschaulicht, wie dies erreicht werden kann.

Das Netzmuster ist eine Kombination aus beiden. Zeichnen Sie zuerst die vertikalen Linien und fügen Sie dann die Einstellung der horizontalen Linien fill als fill='transparent' hinzu, um sicherzustellen, dass die vertikalen Linien nicht gezeichnet werden.

Bis es ein Pattern-Update gibt, hoffe ich, dass einige von Ihnen dies nützlich finden.

EDIT 2:

Zusätzlich können diagonale Muster hinzugefügt werden. Ich habe dem Datenrahmen eine zusätzliche Variable hinzugefügt:

Example.Data[4,] <- c(20, 'Diagonal Pattern','Diagonal Pattern' )

Dann habe ich einen neuen Datenrahmen erstellt, der die Koordinaten für die diagonalen Linien enthält:

Diag <- data.frame(
  x = c(1,1,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y = c(0,0,20,20),
  x2 = c(1.2,1.2,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y2 = c(0,0,11.5,11.5),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  x3 = c(1.38,1.38,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y3 = c(0,0,3.5,3.5),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  x4 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y4 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  x5 = c(.6,.6,1.07,1.07), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y5 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  x6 = c(.555,.555,.88,.88), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y6 = c(6,6,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  x7 = c(.555,.555,.72,.72), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y7 = c(13,13,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  x8 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y8 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical Edge lines.
  #Variable = "Diagonal Pattern",
  Fill = "Diagonal Pattern"
  )

Von dort aus fügte ich dem ggplot oben geom_paths hinzu, wobei jeweils unterschiedliche Koordinaten aufgerufen und die Linien über die gewünschte Leiste gezeichnet wurden:

+geom_path(data=Diag, aes(x=x, y=y),colour = "black")+  # calls co-or for sig. line & draws
  geom_path(data=Diag, aes(x=x2, y=y2),colour = "black")+  # calls co-or for sig. line & draws
  geom_path(data=Diag, aes(x=x3, y=y3),colour = "black")+
  geom_path(data=Diag, aes(x=x4, y=y4),colour = "black")+
  geom_path(data=Diag, aes(x=x5, y=y5),colour = "black")+
  geom_path(data=Diag, aes(x=x6, y=y6),colour = "black")+
  geom_path(data=Diag, aes(x=x7, y=y7),colour = "black")

Daraus ergibt sich Folgendes:

enter image description here

Es ist ein bisschen nachlässig, da ich nicht zu viel Zeit investiert habe, um die Linien perfekt winklig und voneinander beabstandet zu machen. Dies sollte jedoch als Konzeptnachweis dienen.

Offensichtlich können sich die Linien in die entgegengesetzte Richtung neigen und es gibt auch Raum für diagonale Vernetzung, ähnlich wie die horizontale und vertikale Vernetzung.

Ich denke, das ist alles, was ich auf der Musterfront anbieten kann. Hoffe, dass jemand eine Verwendung dafür finden kann.

EDIT 3: Berühmte letzte Worte. Ich habe mir eine andere Musteroption ausgedacht. Diesmal mit geom_jitter.

Wieder fügte ich dem Datenrahmen eine weitere Variable hinzu:

Example.Data[5,] <- c(100, 'Bubble Pattern','Bubble Pattern' )

Und ich ordnete an, wie jedes Muster dargestellt werden sollte

Example.Data$Variable = Relevel(Example.Data$Variable, ref = c("Diagonal Pattern", "Bubble Pattern","Horizontal Pattern","Mesh Pattern","Vertical Pattern"))

Als Nächstes habe ich eine Spalte erstellt, die die Nummer enthält, die der beabsichtigten Zielleiste auf der X-Achse zugeordnet ist:

Example.Data$Bubbles <- 2

Es folgen Spalten, um die Positionen auf der y-Achse der 'Blasen' zu enthalten:

Example.Data$Points <- c(5, 10, 15, 20, 25)
Example.Data$Points2 <- c(30, 35, 40, 45, 50)
Example.Data$Points3 <- c(55, 60, 65, 70, 75)
Example.Data$Points4 <- c(80, 85, 90, 95, 7)
Example.Data$Points5 <- c(14, 21, 28, 35, 42)
Example.Data$Points6 <- c(49, 56, 63, 71, 78)
Example.Data$Points7 <- c(84, 91, 98, 6, 12)

Schließlich habe ich geom_jitters zu dem ggplot oben hinzugefügt, wobei ich die neuen Spalten zum Positionieren und erneuten Verwenden von 'Points' zum Variieren der Größe der 'Blasen' verwendet habe:

+geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)

Jedes Mal, wenn der Plot ausgeführt wird, positioniert der Jitter die 'Blasen' anders, aber hier ist eine der schöneren Ausgaben, die ich hatte:

enter image description here

Manchmal zittern die "Blasen" außerhalb der Grenzen. Wenn dies geschieht, führen Sie den Vorgang erneut durch oder exportieren Sie ihn in größeren Dimensionen. In jedem Inkrement auf der y-Achse können mehr Blasen dargestellt werden, die auf Wunsch mehr Platz auf dem leeren Platz einnehmen.

Das macht bis zu 7 Muster (wenn Sie gegenüberliegende geneigte Diagonalen und diagonale Maschen beider verwenden), die in ggplot gehackt werden können.

Fühlen Sie sich frei, mehr vorzuschlagen, wenn jemand an etwas denken kann.

EDIT 4: Ich habe an einer Wrapper-Funktion gearbeitet, um Schraffuren/Muster in ggplot2 zu automatisieren. Ich werde einen Link posten, sobald ich die Funktion erweitert habe, um Muster in Facet_grid-Plots usw. zuzulassen. Hier ist eine Ausgabe mit der Funktionseingabe für ein einfaches Plot von Balken als Beispiel:

 enter image description here

Ich füge eine letzte Bearbeitung hinzu, sobald ich die Funktion zum Teilen bereit habe.

EDIT 5: Hier ist ein Link zu der Funktion EggHatch, die ich geschrieben habe, um das Hinzufügen von Mustern zu geom_bar-Plots ein wenig zu erleichtern.

76
Docconcoct

Derzeit ist dies nicht möglich, da grid (das Grafiksystem, das ggplot2 für die eigentliche Zeichnung verwendet) keine Texturen unterstützt. Es tut uns leid!

63
hadley

Sie können das Paket ggtextures von @ claus wilke um strukturierte Rechtecke und Balken mit ggplot2 zu zeichnen.

# Image/pattern randomly selected from README
path_image <- "http://www.hypergridbusiness.com/wp-content/uploads/2012/12/rocks2-256.jpg"

library(ggplot2)
# devtools::install_github("clauswilke/ggtextures")
ggplot(mtcars, aes(cyl, mpg)) + 
  ggtextures::geom_textured_bar(stat = "identity", image = path_image)

enter image description here

Sie können es auch mit anderen Geoms kombinieren:

data_raw <- data.frame(x = round(rbinom(1000, 50, 0.1)))
ggplot(data_raw, aes(x)) +
  geom_textured_bar(
    aes(y = ..prop..), image = path_image
  ) +
  geom_density()

enter image description here

9
PoGibas

Ich finde Docconcoct Arbeit ist toll, aber jetzt habe ich plötzlich ein spezielles Paket gegoogelt --- Patternplot . Ich habe keinen internen Code gesehen, aber die Vignette scheint nützlich zu sein.

1
UlvHare

Es kann nützlich sein, einen Dummy-Datenrahmen zu erstellen, dessen Konturen "Texturen" entsprechen, und dann geom_contour zu verwenden. Hier ist mein Beispiel:

library(ggplot2)

eg = expand.grid(R1 = seq(0,1,by=0.01), R2 = seq(0,1,by=0.01))
     eg$importance = (eg$R1+eg$R2)/2

  ggplot(eg , aes(x = R1, y = R2)) +
  geom_raster(aes(fill = importance), interpolate=TRUE) +
  scale_fill_gradient2(low="white", high="gray20", limits=c(0,1)) +
  theme_classic()+
  geom_contour(bins=5,aes(z=importance), color="black", size=0.6)+
  coord_fixed(ratio = 1, xlim=c(0,1),ylim=c(0,1))

Und hier ist das Ergebnis: schattierter Plot mit Linien

(die Zeilen sollten geglättet sein)

0
Ondrej Vencalek

Dies ist eine Folgefrage zu dem von @Docconcoct hinterlassenen Beitrag (der mit 5 Änderungen).

Das relativ kleine reproduzierbare Beispiel unten zeigt zwei Ansätze für eine Zeichnung, die wir erstellen möchten. Der erste verwendet ggplot, ist aber unvollständig. Die unten erzeugte zweite Grafik verwendet Basis-R-Grafiken und ist vollständig. Gibt es eine Möglichkeit, mit ggplot das zu erreichen, was in der zweiten Darstellung gezeigt wird? Ich war total verloren, als ich versuchte, dem Ansatz von Docconcoct zu folgen.

library(ggplot2)

dat <- read.table(textConnection("wrDec scen src       value
43  1850   1C  gw    39.34253
49  1850   2C  gw    87.24263
55  1850   3C  gw   133.36214
61  1850   4C  gw   189.87629
67  1850   5C  gw   234.49438
7   1850   1C  sw  -332.00033
13  1850   2C  sw  -705.26090
19  1850   3C  sw -1109.10350
25  1850   4C  sw -1538.89468
31  1850   5C  sw -1941.11464
44  1860   1C  gw   161.65695
50  1860   2C  gw   337.63655
56  1860   3C  gw   537.13948
62  1860   4C  gw   720.46927
68  1860   5C  gw   928.40398
8   1860   1C  sw  -483.56331
14  1860   2C  sw -1006.67141
20  1860   3C  sw -1584.47668
26  1860   4C  sw -2167.01980
32  1860   5C  sw -2775.84317
45  1870   1C  gw    93.09717
51  1870   2C  gw   190.74712
57  1870   3C  gw   295.68164
63  1870   4C  gw   391.21511
69  1870   5C  gw   495.22644
9   1870   1C  sw  -378.80846
15  1870   2C  sw  -785.45633
21  1870   3C  sw -1205.84678
27  1870   4C  sw -1644.12112
33  1870   5C  sw -2077.68337
46  1880   1C  gw    29.61092
52  1880   2C  gw    60.59267
58  1880   3C  gw    95.47988
64  1880   4C  gw   132.15479
70  1880   5C  gw   171.48976
10  1880   1C  sw  -210.97875
16  1880   2C  sw  -428.38672
22  1880   3C  sw  -682.01563
28  1880   4C  sw  -943.77363
34  1880   5C  sw -1213.56345
47  1890   1C  gw    12.29025
53  1890   2C  gw    24.11237
59  1890   3C  gw    36.90570
65  1890   4C  gw    50.74161
71  1890   5C  gw    66.29961
11  1890   1C  sw  -476.12546
17  1890   2C  sw  -885.65743
23  1890   3C  sw -1328.05086
29  1890   4C  sw -1782.29492
35  1890   5C  sw -2241.68459
48 1900+   1C  gw    19.06018
54 1900+   2C  gw    38.51153
60 1900+   3C  gw    60.85222
66 1900+   4C  gw    81.35425
72 1900+   5C  gw   105.22905
12 1900+   1C  sw  -264.40595
18 1900+   2C  sw  -504.66240
24 1900+   3C  sw  -808.04811
30 1900+   4C  sw -1136.96551
36 1900+   5C  sw -1539.09301"), header=TRUE)

ggplot(data=dat, aes(x=scen, y=value, fill=src)) + 
  geom_bar(stat="identity") + 
  facet_grid(~wrDec) + 
  ylab(expression(paste('Change in Average Annual Delivered Water,  ',ac%.%ft,sep='')))


# Base Graphics approach
# ----------------------
dev.new()
gwUse_chng <- matrix(subset(dat, dat$src=='gw')$value,
                       nrow = 5, ncol = 6, byrow = FALSE,
                       dimnames = list(c('1_deg', '2_deg', '3_deg', '4_deg', '5_deg'),
                                       c('1850','1860','1870','1880','1890','1900+')))

swUse_chng <- matrix(subset(dat, dat$src=='sw')$value,
                       nrow = 5, ncol = 6, byrow = FALSE,
                       dimnames = list(c('1_deg', '2_deg', '3_deg', '4_deg', '5_deg'),
                                       c('1850','1860','1870','1880','1890','1900+')))

net_chng <- swUse_chng + gwUse_chng


par(mar=c(3,6,1,0.5))
barplot(gwUse_chng, beside=TRUE, las=1, yaxt='n', yaxs='i', ylim=c(-3000, 1000), col='lightblue')
par(new=TRUE)
barplot(swUse_chng, beside=TRUE, las=1, yaxt='n', yaxs='i', ylim=c(-3000, 1000), col='mistyrose')
par(new=TRUE)
barplot(net_chng, beside=TRUE, las=1, yaxt='n', yaxs='i', ylim=c(-3000, 1000), col='black', ang=135, den=15)
legend("bottomleft", c('Groundwater','Surface-water','Net'), 
       fill=c('lightblue','mistyrose','black'), ang=c(NA,NA,135), den=c(NA,NA,25), bty='n', bg='white')
axis(side=2, at=seq(-3000,1000,by=500), labels=c('-3,000','-2,500','-2,000','-1,500','-1,000','-500','0','500','1,000'),las=1)
abline(h=0, lwd=1)
abline(v=seq(6.5, 30.5,by=6), col='grey90')
abline(h=-3000, col='black')
0
user2256085