2016-08-03 23 views
1

Ich versuche, zwei Achsen gleichzeitig mit twoway zu zeichnen. Eine Achse verwendet die Variable route zum Ersetzen des üblichen Symbols mit mlabel und msymbol(none). Die andere Achse benötigt keine spezifische Bezeichnung in der Zeichnungsregion, sondern sollte idealerweise in der Legende als "Inkr. Dosis" eingegeben werden.Stata: Reihenfolge der Legendenelemente mit mehreren Achsen

Ein unerwünschtes Ergebnis tritt auf, wenn die Spezifikation legend(order) zum Erstellen der Legendenbeschriftungen verwendet wird. Die Legende als codiert hat das Symbol für die zweite Achse als drittes geordnetes Legendenelement. Ich würde erwarten, dass der Code das Symbol für die zweite Achse als fünften Artikel platziert. Das Problem kann behoben werden, indem eine Dummy-Kategorie für eine unbenutzte 5. route hinzugefügt und das Symbol von Hand mit dem Grafikeditor verschoben wird. Ich würde gerne wissen, warum die legend(order) Option verhält sich so, ob es eine Interaktion mit mlabel oder msymbol(none) und wenn eine Kodierungslösung für den Einsatz in der wiederholten Anwendung verfügbar ist.

*create data 
clear 
set seed 42 
set obs 50 

gen cuml_dose = rnormal(0,1) *10 + 100 
sort cuml_dose 
gen interval = [_n] 
gen id = 1 
gen incr_dose =0 
replace incr_dose = cuml_dose[_n+1] - cuml_dose if [_n] > 1 
gen route = rpoisson(1) 
tab route,m 

*create problem graph 
sort interval 
twoway scatter cuml_dose interval, mlabel(route) msymbol(none) yaxis(1) || /// 
    scatter incr_dose interval, yaxis(2) /// 
    legend(on) legend(order(0 "0=oral" 1 "1=IV" 2 "2=IM" 3 "3=patch")) 

*partial solution 
twoway scatter cuml_dose interval, mlabel(route) msymbol(none) yaxis(1) || /// 
    scatter incr_dose interval, yaxis(2) /// 
    legend(on) legend(order(0 "0=oral" 1 "1=IV" 2 "2=IM" 3 "3=patch" 4 "Incr. dose")) 

Antwort

2

Danke für das in sich geschlossene Beispiel.

Betrachten

scatter cuml_dose interval, mlabel(route) ms(none) yaxis(1) /// 
|| scatter incr_dose interval, yaxis(2) /// 
legend(on order(- "0 = Oral" - "1 = IV" - "2 = IM" - "3 = patch" 2 "Incr. dose")) 

In Ihrem letzten Graph,

  1. cuml_dose ist die erste Variable aufgetragen: die Tatsache, dass Sie Marker-Etikett mit mehreren unterschiedlichen Werten verwenden ist zum Zählen irrelevant. Also, es entspricht nicht 0 bis 3. Ich bin überrascht, dass ein Verweis auf 0 in order() erlaubt ist. Am wichtigsten ist, Marker-Etiketten sind nur Text und ist es egal, was der Text ist darüber hinaus zeigt es wie angewiesen.

  2. incr_dose ist die zweite Variable gezeichnet: daher order(2 ... ) verwenden.

  3. Sie können die Legende wie oben mit Bindestrichsyntax beliebig hinzufügen.

  4. Ich kann nicht sehen, dass die Verwendung von zwei Achsen hier überhaupt problematisch ist, um die Legende zu definieren. Wir zählen nur, was auf einer Achse y gezeichnet wird.

Fazit: zählen, was auf jede y Achse in der genannten Reihenfolge von Variablen in der Syntax aufgetragen ist.