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- ggplot2
Dokumentation durchsucht , aber nichts über das Hinzufügen von Texturen zum Füllen von Farben gesehen. Gibt es einen offiziellen ggplot2
Weg, 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.
102
Antworten:
ggplot kann Farbbrauer-Paletten verwenden. Einige davon sind "fotokopierfreundlich". Also mabe so etwas wird für dich funktionieren?
In diesem Fall ist OrRd eine Palette auf der Colorbrewer-Webseite: http://colorbrewer2.org/
quelle
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:
Produziert dies:
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
fill
fü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:
Dann habe ich einen neuen Datenrahmen erstellt, der die Koordinaten für die diagonalen Linien enthält:
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:
Dies führt zu folgenden Ergebnissen:
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 mit
geom_jitter
.Wieder habe ich dem Datenrahmen eine weitere Variable hinzugefügt:
Und ich bestellte, wie ich jedes Muster präsentieren wollte:
Als Nächstes habe ich eine Spalte erstellt, die die Nummer enthält, die der beabsichtigten Zielleiste auf der x-Achse zugeordnet ist:
Gefolgt von Spalten, die die Positionen der 'Blasen' auf der y-Achse enthalten:
Schließlich habe ich
geom_jitter
dem 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: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:
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:
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.
quelle
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!
quelle
Sie können das Paket ggtextures von @claus wilke verwenden, um strukturierte Rechtecke und Balken mit zu zeichnen
ggplot2
.Sie können es auch mit anderen Geoms kombinieren:
quelle
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.
quelle
ggrough
könnte von Interesse sein: https://xvrdm.github.io/ggrough/quelle
Es kann nützlich sein, einen Dummy-Datenrahmen zu erstellen, dessen Konturen "Texturen" entsprechen, und dann geom_contour zu verwenden. Hier ist mein Beispiel:
Und hier ist das Ergebnis: schattierte Darstellung mit Linien
(Die Linien sollten geglättet werden)
quelle
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:
was zu dieser Handlung führt:
Wenn nur einige Balken gestreift werden sollen,
geom_col_pattern()
gibt es einpattern_alpha
Argument, mit dem bestimmte unerwünschte Streifen vollständig transparent gemacht werden könnten.quelle