So fügen Sie Textur hinzu, um Farben in ggplot2 zu füllen

102

Ich verwende derzeit das scale_brewer()Füllen und diese sehen in Farbe (auf dem Bildschirm und über einen Farbdrucker) wunderschön aus, drucken jedoch bei Verwendung eines Schwarzweißdruckers relativ gleichmäßig als Grautöne. Ich habe die Online- ggplot2Dokumentation durchsucht , aber nichts über das Hinzufügen von Texturen zum Füllen von Farben gesehen. Gibt es einen offiziellen ggplot2Weg, 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.

rhh
quelle

Antworten:

35

ggplot kann Farbbrauer-Paletten verwenden. Einige davon sind "fotokopierfreundlich". Also 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/

Fotokopierfreundlich: Dies zeigt an, dass ein bestimmtes Farbschema dem Schwarzweiß-Fotokopieren standhält. Abweichende Schemata können nicht erfolgreich fotokopiert werden. Helligkeitsunterschiede sollten mit sequentiellen Schemata erhalten bleiben.

Andreas
quelle
22
Beantwortet die Frage des OP nicht. Ich bin hierher gekommen, weil ich an bestimmten Farben festhalte. Diese akzeptierte "Antwort" schlägt nicht vor, wie Texturen angewendet werden sollen.
MS Berends
3
@MSBerends beantwortet Ihre Frage nicht . Ziemlich sicher, dass das grüne Häkchen ein Zeichen dafür ist, dass es die Frage beantwortet hat!
Yan Foto
10
Lassen Sie sich nicht von einem Häkchen täuschen. Die Frage war, wie man Texturen anwendet - und das wird nicht beantwortet. Eine Idee außerhalb des Rahmens wurde bereitgestellt, ja, aber keine Antwort auf die Frage.
MS Berends
83

Hey Leute, hier ist ein kleiner Hack, der das Texturproblem auf sehr grundlegende Weise angeht:

ggplot2: Machen Sie den Rand eines Balkens mit R dunkler als die anderen

EDIT: Ich habe endlich Zeit gefunden, ein kurzes Beispiel für diesen Hack zu geben, der mindestens drei Arten von Grundmustern in ggplot2 zulässt. 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 dies:

Geben Sie hier die Bildbeschreibung ein

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

Wie zu sehen ist, produziere ich einige sehr grundlegende Daten. Um die vertikalen Linien zu erhalten, erstelle ich einfach einen Datenrahmen, der die Variable enthält, zu der ich vertikale Linien hinzufügen wollte, und zeichne die Diagrammränder mehrmals neu, wobei die Breite jedes Mal verringert wird.

Ähnliches gilt für die horizontalen Linien, aber für jedes Neuzeichnen wird ein neuer Datenrahmen benötigt, bei dem ich einen Wert (in meinem Beispiel '5') von dem Wert abgezogen habe, der der interessierenden Variablen zugeordnet ist. Effektiv die Höhe der Stange senken. Dies ist umständlich zu erreichen, und es gibt möglicherweise optimierte Ansätze, aber dies zeigt, 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 fillfür horizontale Linien als hinzufill='transparent' um sicherzustellen, dass die vertikalen Linien nicht überzeichnet werden.

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

EDIT 2:

Zusätzlich können auch 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 habe ich dem obigen ggplot geom_paths hinzugefügt, wobei jeder andere Koordinaten aufruft und die Linien über den gewünschten Balken zeichnet:

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

Dies führt zu folgenden Ergebnissen:

Geben Sie hier die Bildbeschreibung ein

Es ist ein bisschen schlampig, da ich nicht zu viel Zeit investiert habe, um die Linien perfekt abgewinkelt und voneinander beabstandet zu machen, aber dies sollte als Proof of Concept dienen.

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

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

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

Wieder habe ich dem Datenrahmen eine weitere Variable hinzugefügt:

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

Und ich bestellte, wie ich jedes Muster präsentieren wollte:

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

Gefolgt von Spalten, die die Positionen der 'Blasen' auf der y-Achse 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_jitterdem obigen ggplot s hinzugefügt , indem ich die neuen Spalten zum Positionieren und Wiederverwenden von 'Punkten' verwendet habe, um die Größe der 'Blasen' zu variieren:

+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:

Geben Sie hier die Bildbeschreibung ein

Manchmal zittern die "Blasen" außerhalb der Grenzen. In diesem Fall erneut ausführen oder einfach in größeren Dimensionen exportieren. Auf jedem Inkrement auf der y-Achse können mehr Blasen aufgezeichnet werden, die auf Wunsch mehr Leerzeichen ausfüllen.

Das sind bis zu 7 Muster (wenn Sie gegenüberliegende diagonale Linien und diagonale Maschen von beiden einschließen), die in ggplot gehackt werden können.

Bitte zögern Sie nicht, mehr vorzuschlagen, wenn jemand darüber nachdenken kann.

EDIT 4: Ich habe an einer Wrapper-Funktion gearbeitet, um Schraffuren / Muster in ggplot2 zu automatisieren. Ich werde einen Link veröffentlichen, 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 Diagramm von Balken als Beispiel:

Geben Sie hier die Bildbeschreibung ein

Ich werde eine letzte Bearbeitung hinzufügen, 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 etwas zu vereinfachen.

Docconcoct
quelle
Gut gemacht! Es scheint jedoch, dass diese Lösung nur für Balkendiagramme funktioniert oder?
SkyWalker
@Giovanni Azua Ich habe es nur für Bar-Plots versucht, ja. Wenn ich Zeit finde, werde ich versuchen, die verknüpfte Funktion für gestapelte Diagramme usw. anzupassen.
Docconcoct
70

Dies ist derzeit nicht möglich, da das Raster (das Grafiksystem, mit dem ggplot2 die eigentliche Zeichnung erstellt) keine Texturen unterstützt. Es tut uns leid!

Hadley
quelle
70
Gibt es Pläne, gridextra als Abhängigkeit hinzuzufügen, um diese Funktionalität zu erhalten?
Russellpierce
Irgendetwas Neues darüber?
Hrant
Dies könnte sich in nicht allzu ferner Zukunft ändern. Sehen Sie sich diese Diskussion an , die auf den bevorstehenden Änderungen am R-Rasterpaket aufbaut .
Stragu
20

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

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

PoGibas
quelle
2
Vielen Dank, dass Sie Ihre Antwort @PoGibas verschoben haben. Ich wette, es wird hier viel mehr (wohlverdiente) Aufmerksamkeit bekommen! Prost
Henrik
Sehr schöne Lösung.
Docconcoct
4
Schauen Sie sich die herunterladbaren Muster hier an: heropatterns.com
Nova
Jetzt muss ich nur noch herausfinden, wie ich ihre Transparenz in R ändern kann. Haha
Nova
2

Ich finde die Arbeit mit Docconcoct großartig, aber jetzt habe ich plötzlich ein spezielles Paket gegoogelt - Patternplot . Interner Code wurde nicht angezeigt, aber die Vignette scheint nützlich zu sein.

UlvHare
quelle
1

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: schattierte Darstellung mit Linien

(Die Linien sollten geglättet werden)

Ondrej Vencalek
quelle
1

Ich habe gerade ein Paket namens ggpattern( https://github.com/coolbutuseless/ggpattern ) entdeckt, das eine gute Lösung für dieses Problem zu sein scheint und sich gut in den ggplot2-Workflow integrieren lässt. Während Lösungen mit Texturen für diagonale Balken gut funktionieren, erzeugen sie keine Vektorgrafiken und sind daher nicht optimal.

Hier ist ein Beispiel, das direkt aus dem Github-Repository von ggpattern stammt:

install.packages("remotes")
remotes::install_github("coolbutuseless/ggpattern")

library(ggplot2)
library(ggpattern)

df <- data.frame(level = c("a", "b", "c", 'd'), outcome = c(2.3, 1.9, 3.2, 1))

ggplot(df) +
  geom_col_pattern(
    aes(level, outcome, pattern_fill = level), 
    pattern = 'stripe',
    fill    = 'white',
    colour  = 'black'
  ) +
  theme_bw(18) +
  theme(legend.position = 'none') + 
  labs(
    title    = "ggpattern::geom_pattern_col()",
    subtitle = "pattern = 'stripe'"
  ) +
  coord_fixed(ratio = 1/2)

was zu dieser Handlung führt:

ggpattern Beispielplot

Wenn nur einige Balken gestreift werden sollen, geom_col_pattern()gibt es ein pattern_alphaArgument, mit dem bestimmte unerwünschte Streifen vollständig transparent gemacht werden könnten.

Fujiu
quelle