Custom shapes in ggplot2

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Custom shapes in ggplot2

Beitrag von bigben »

Liebe ggplot2-Kundigen!

wenn ich den jährlichem Umsatz an Schokoosterhasen mit gleichjährigen Schokoweihnachtsmännern vergleichen möchte, kann ich die Punkte für Gruppe 1 als Häschen und die für Gruppe 2 als Santa Claus darstellen? Wenn ich Rechts-Abbiegeunfälle mit Linksabbiegeunfällen vergleichen will, kann ich Pfeile nach links oder rechts einstellen?

Ein etwas realistischerer Fall: Bei der Reintonaudiometrie, einer bestimmten Form von Hörtestung, trägt man auf der x-Achse die Tonhöhe und auf der y-Achse die Signalintensität ab. Es gibt es recht klare Konventionen, wie so ein Diagramm auszusehen hat. Die Seite des untersuchten Ohres wird z. B. mit den Farben codiert (rechte Ohren immer rot, linke immer blau) und die Details des Messaufbaus mit den eingetragenen Symbolen. Diese Symbole sind in ggplot2 nicht alle banal nachzubilden. Ein Bild aus den Weiten des WWW:

Bild

Die "Bone Conduction" Symbole in diesem Fall kann ich noch über Sonderzeichen und eckige Klammern abbilden(*), aber die "No Response" Pfeile finde ich in ASCII eher nicht.

Zwei andere Vorschläge aus dem WWW:

Bild


Bild

Das (und noch mehr) würde ich gerne alles irgendwie abbilden und idealerweise mit geom_point und ohne einen eigenen Font erstellen zu müssen. Meine bisherige Suche war ergebnislos. Kann mir jemand einen Tipp geben, welcher Hebel sich da ansetzen ließe?

LG,
Bernhard


(*) Immerhin hat meine Suche mich schon mal gelehrt, dass man Zeichen im Font über ASCII-Nummern ansprechen kann:

Code: Alles auswählen

library(ggplot2)
bsp <- data.frame(a = 110:204,
                  b = gl(5, 95/5))
ggplot(bsp, aes(x=b, y=a-19*(as.integer(b)), shape=factor(a))) + 
  geom_point(size=5) +
  scale_shape_manual(values=bsp$a)
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Custom shapes in ggplot2

Beitrag von Athomas »

Du kannst über scale_shape_manual UTF-8-Zeichen zuweisen, Du musst nur die "passenden" Zeichen finden!

Das klappt bei mir nur mit Linux (Ubuntu 18.04), nicht mit Windows!

Code: Alles auswählen

Daten <- data.frame(x=1:10,y=1:10)

library(ggplot2)
ggplot(Daten,aes(x,y,shape=as.factor(y)))+
  theme_bw() +
  geom_point(size=10)+
  scale_shape_manual(values=c("\U2197","\U2198","\U25B3","\U25A1","\u2603","\U00002603","d","r","i","s"))
Rplot.jpeg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Custom shapes in ggplot2

Beitrag von bigben »

Hallo Athomas,

ich bin zwei Schritte vorangekommen. Durch Deinen Post habe ich nachgesehen und gefunden, wie vielseitig UTF-8 eigentlich ist. Natürlich werde ich da nicht jedes x-beliebige Zeichen finden, wäre für meinen Zweck aber erstmal befriedigt. Wie Du schon richtig schreibst, funktioniert das unter Windows nicht. Dein Plot sieht so aus:
Rplot.png
Rplot.png (8.12 KiB) 699 mal betrachtet
Die Erklärung wird sein, dass der unter Windows verwendete Font diese Zeichen nicht umfasst. Dummerweise wollte ich aber gerade diesen Code nicht nur "für mich" schreiben, sondern als ein kleines Package auch weitergeben. Eigentlich suche ich also nach einer Lösung, die unter allen Betriebssystemen funktioniert. Kennt jemand eine gute Ressource zur Frage, welche Zeichen unter Windows, Linux und Apple funktionieren?
Gibt es einen freien Font, der sowas alles implementiert und wenn ja, kann man den mit einem R Paket verteilen?

Ansonsten habe ich inzwischen herausgefunden, dass es ein Package namens cowplot gibt, das eine Funktion drawimage implementiert, mit der man grundsätzlich PNGs in Grafiken malen kann, aber erstens nicht mit "richtigen" Koordinaten und zweitens hätte ich lieber die volle Macht von geom_point.

GLG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Custom shapes in ggplot2

Beitrag von EDi »

Es gibt auch ggimage - mit geom_image. Damit sind der Kreativität fast keine Grenzen mehr gesetzt . geom_pokemon kann man bestimmt gut einbauen :D
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Custom shapes in ggplot2

Beitrag von EDi »

BTW: für meine Disputation hab ich die plots Publikumsgerecht im xkcd-stil aufbereitet, z.b. https://github.com/EDiLD/phd_defense/bl ... w_xkcd.pdf

Definitiv besser als das Original aus der Veröffentlichung https://github.com/EDiLD/usetheglm/blob ... glob_c.pdf.


Alles mit R gemacht, auch das xkcd Männlein: https://github.com/EDiLD/phd_defense/bl ... ots.R#L206

Ich hatte eindeutig nichts besseres zu tun zu der Zeit... :lol:
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Custom shapes in ggplot2

Beitrag von bigben »

Hallo Athomas und EDi!

Zu dem Ansatz, mit geom_point und UTF-8 Zeichen zu arbeiten kann ich nachtragen, dass ich auf meinem Windows-Rechner einen Font gefunden habe, der Lucida Sans Unicode heißt und der diese ganzen Pfeile tatsächlich implementiert hat und den Windows wohl auch schon lange mitbringt.

Zu ggimage: Ich weiß nicht, wonach ich gesucht habe, dass ich ein Package mit diesem scheinbar offensichtlichen Namen übersehen habe. Nach einem ersten schnellen Blick scheint das genau das zu sein, was ich initial im Sinn hatte. Ich habe jetzt also zwei gute Ansätze, die ich verfolgen kann.
Ich hatte eindeutig nichts besseres zu tun zu der Zeit
Ich habe heute den letzten meiner 14 Tage behördlich auferlegter Quarantäne, nachdem ich beruflich Kontakt zu einem Patienten hatte, der sich dann als Corona-positiv erwies. Natürlich habe ich in den 14 Tagen gesunder Freistellung von fast allem quasi nichts erledigt, von alledem, was ich so im Sinn hatte. So ist das nunmal. Ab morgen wird wieder gearbeitet, und dann muss man mal sehen, ob aus dem Projekt, um das es mir hier ging noch was wird oder nicht.

Vielen Dank Euch beiden!
GLG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten