Umgang mit ggplot2 und überlappenden Beschriftungen auf einer diskreten Achse

8

ggplot2 scheint keine eingebaute Methode zu haben, um mit Überstreichen von Text auf Streudiagramme . Ich habe jedoch eine andere Situation, in der die Bezeichnungen auf einer diskreten Achse liegen, und ich frage mich, ob jemand hier eine bessere Lösung hat als das, was ich gemacht habe.

Ein Beispielcode:

%Vor%

So sehen wir, dass die X-Achsenbeschriftungen übereinander liegen. Zwei Lösungen kommen mir in den Sinn: 1) Abkürzungen der Etiketten und 2) Hinzufügen von Zeilenumbrüchen zu den Etiketten. In vielen Fällen (1) wird es reichen, aber in einigen Fällen ist dies nicht möglich. Also schrieb ich eine Funktion zum Hinzufügen von Zeilenumbrüchen ( \n ) jedes n-ten Zeichen zu den Strings, um sich überschneidende Namen zu vermeiden:

%Vor%

Und die Ausgabe ist:

Dann kann man etwas Zeit damit verbringen, mit der Intervallgröße zu spielen, um zu vermeiden, dass zwischen den Labels zu viel Leerraum ist.

Wenn die Anzahl der Etiketten variiert, ist diese Art der Lösung nicht so gut, da sich die optimale Intervallgröße ändert. Da die normale Schriftart nicht mono-beabstandet ist, wirkt sich der Text der Beschriftungen auch auf die Breite aus, und daher muss man bei der Auswahl eines guten Intervalls besondere Vorsicht walten lassen (dies kann man vermeiden, indem man eine Monospace-Schriftart verwendet) , aber sie sind extra breit). Schließlich ist die Funktion new_lines_adder() dumm, weil sie Wörter auf zweifelhafte Weise in zwei Teile teilt, die Menschen nicht tun würden. Z.B. in dem oben genannten spaltete es "Atem" in "Brust". Man könnte es umschreiben, um dieses Problem zu vermeiden.

Man kann auch die Schriftgröße verkleinern, aber das ist ein Kompromiss mit der Lesbarkeit und oft ist die Verringerung der Schriftgröße unnötig.

Was ist der beste Weg, um diese Art von Etikettenüberladung zu behandeln?

    
Deleet 02.06.2015, 14:04
quelle

2 Antworten

0

Aufbauend auf der Antwort und dem Kommentar von @Stibu berücksichtigt diese Lösung die Anzahl der Gruppen und verwendet die intelligente Aufteilung, die von Stibu entwickelt wurde, während ein Fix für durch einen Schrägstrich getrennte Wörter hinzugefügt wird.

Funktionen:

%Vor%

Ich habe einige Werte für die Standardeingabe ausprobiert und 85 ist der Wert, für den das Textergebnis für die Beispieldaten annehmbar ist. Alle höheren und "Venen" in Label 2 werden nach oben bewegt und kommen der dritten Marke zu nahe.

So sieht es aus:

Dennoch wäre es besser, ein echtes Maß für die gesamte Textbreite zu verwenden, und nicht die Anzahl der Zeichen, die sich auf diesen Proxy verlassen müssen, bedeutet im Allgemeinen, dass die Etiketten viel Platz verschwenden. Vielleicht könnte man new_lines_adder() mit einem Code auf Basis von strwidth umschreiben, um das Problem ungleicher Zeichenbreiten zu lösen.

Ich lasse diese Frage unbeantwortet, falls jemand einen Weg finden könnte, dies zu tun.

Ich habe die beiden Funktionen zu meinem persönlichen Paket auf github hinzugefügt, damit jeder, der sie benutzen möchte, sie von dort holen kann dort.

    
Deleet 05.06.2015, 08:46
quelle
4

Ich habe versucht, eine andere Version von new_lines_adder :

zusammenzustellen %Vor%

Sie teilt Zeilen nur in Leerzeichen auf und stellt sicher, dass die Zeilen höchstens die Anzahl der Zeichen enthalten, die von interval angegeben werden. Damit sieht Ihre Handlung folgendermaßen aus:

Ich würde nicht behaupten, dass dies der beste Weg ist. Es ignoriert weiterhin, dass nicht alle Zeichen dieselbe Breite haben. Vielleicht kann mit strwidth etwas Besseres erreicht werden.

Übrigens: Sie können add_newlines folgendermaßen vereinfachen:

%Vor%

Am Anfang stellt as.character sicher, dass Sie eine Zeichenkette haben. Es tut auch nicht weh, das zu tun, wenn Sie bereits eine Zeichenkette haben, so dass die if -Klausel nicht benötigt wird.

Auch die nächste if -Klausel ist unnötig: Sapply funktioniert perfekt, wenn x nur ein Element enthält. Und Sie können die Namen unterdrücken, indem Sie USE.NAMES=FALSE so setzen, dass Sie die Namen in einer zusätzlichen Zeile nicht entfernen müssen.

    
Stibu 02.06.2015 19:17
quelle

Tags und Links