Force-Legende mit Markierung und Farbe des ZeilenstatusHallo,
Ich versuche, eine Legende mit Markierungen und Farben zu erstellen, möchte sie aber auswählen. Ich dachte, dass es dank des Zeilenstatus (Farbstatus, Markierungsstatus, Kombinationsstatus) einfach sein würde. Aber sobald jeder Zeile Farbe und Marker zugewiesen sind, kann ich sie nicht in der Legende erzwingen.
Ich würde es gerne per Skript machen (ich dachte darüber nach, ein Feld mit der Legende hinzuzufügen), aber ich finde keine Möglichkeit, mit den von mir erstellten „Markierungen“ umzugehen.
Danke
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenDanke Ian,
Es kommt meiner ursprünglichen Idee näher und lässt sich leicht in mein Skript integrieren.
Daher bevorzuge ich diese Lösung etwas, auch wenn die andere gut funktioniert.
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenIch habe nicht herausgefunden, wie man das mit einem Skript macht, aber wenn Sie zu Zeilen>Farbe oder Nach Spalte markieren gehen
Sie erhalten Folgendes

Jetzt können Sie mit der rechten Maustaste auf die Legende klicken und sie nach Ihren Wünschen ändern. Wenn Sie „Fenster mit Legende erstellen“ ausgewählt haben, wird eine Legende für Sie erstellt. Dies hat den zusätzlichen Vorteil, dass Sie in der Tabelle alles auswählen können, was Sie in der Legende ausgewählt haben.
Sie können dasselbe innerhalb der Skripterstellung tun mit:
Names Default to here(1);
dt = Open("$SAMPLE_DATA\Big CLass.jmp");
legend = dt << Marker By Column(:age);
new window("Not Really",
Hlistbox(
bivariate(Y(:height), X(:weight)),
legend
)
)
Aber Sie verlieren (zumindest habe ich keinen Weg gefunden, dies zu tun) die Anpassbarkeit, die Sie suchen
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenAlternativ könnten Sie die Verwendung von „MarkerSeg“ in Betracht ziehen. Im Code unten ist „dt“ eine Tabelle aller unterschiedlichen Ebenen der Spalte, die Sie einfärben und markieren möchten. Sie können „Tabellen > Zusammenfassung“ verwenden und dies unsichtbar machen.
NamesDefaultToHere(1);
// Example data table (markers and colors assigned by 'Lot ID')
dt = New Table( "Rows With Colors and Markers",
Add Rows( 12 ),
New Column( "Lot ID",
Character,
"Nominal",
Set Values(
{"lot1", "lot10", "lot11", "lot12", "lot13", "lot2", "lot3", "lot4",
"lot5", "lot6", "lot7", "lot8"}
),
Lock( 1 )
),
Set Row States(
[896.813481688499, 1104.17848521471, 34064.2516910434, 1584.79095828533,
1856.1745531559, 34848.5869575739, 35120.7292968035, 2704.17450988293,
2976.75480300188, 3200.51829791069, 3408.21706777811, 36368.77437675]
)
);
// Make legend window with MarkerSeg
n = NRow(dt);
xx = J(n, 1, 1);
yy = Transpose(1::n);
legendList = Column(dt, "Lot ID") << getValues;
gb = Graph Box(
FrameSize( 150, 300*(n/16) ),
Y Scale( 0, n+1 ),
X Scale( 0, 6 ),
Y Name(" "),
X Name(" "),
Y Axis(ShowLabels(0), ShowMajorTicks(0), ShowMinorTicks(0)),
X Axis(ShowLabels(0), ShowMajorTicks(0), ShowMinorTicks(0)),
Marker Seg( xx, yy, Row States( dt ) ),
For( i = 1, i<=n, i++, Text( {1.5, i-0.1}, legendList[i] ) )
);
db = PanelBox("Row State Colours and Markers for 'Lot ID'", gb);
New Window( "My Legend", db);
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenEs scheint eine gute Lösung zu sein. Ich muss es jetzt an meinen Fall anpassen. Vielen Dank!
Nur vom Reihenstatus enttäuscht!
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenWenn man hinschaut
Hilfe==>Skriptindex
und schauen Sie sich sowohl die Graph Builder- als auch die Legend Box()-Elemente an. Die Bearbeitung der Legende nach der Ausführung des Graph Builder ist begrenzt. Sie können jedoch eine Technik verwenden, die für alles funktioniert, aber etwas umständlich ist. Wenn Sie eine Literalzeichenfolge generieren, die den Code enthält, den Sie benötigen, damit der Graph Builder das tut, was Sie möchten, können Sie diese Literalzeichenfolge dann ausführen. Hier ist ein sehr einfaches Beispiel, aber ich denke, Sie werden sehen, was man damit alles machen kann
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" );
Summarize( dt, groups = by( dt:sex ) );
numofgroups = N Items( groups );
TheCode =
"Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
\!"400\!",
ScaleBox,
{Legend Model(
1,";
For( i = 0, i <= numofgroups - 1, i++,
Show( i );
TheCode = TheCode || "Properties(" || Char( i ) || ", {Line Color (" || Char( i + 3 ) || "),Marker( " || Char( 16 - i ) || ")}),";
);
TheCode = TheCode || "Dispatch( {}, \!"400\!", LegendBox, {Legend Position( {1, [2, 3], 1, [0, 1]} ), Position( {2, 3, 0, 1} )} ))';";
Eval( Parse( TheCode ) );Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenDanke Jim
1. Ich stimme zu, dass es kein wirkliches Problem ist ... Mit etwas Arbeit schaffe ich es, die Liste zu bekommen!
2. Vielleicht habe ich mich nicht klar genug ausgedrückt. Wie Sie bereits erwähnt haben, kann ich in der Legende leicht die Anzahl (N) der Elemente ermitteln, die geändert werden müssen. Das bedeutet, dass ich N Zeilen im Skript erstellen muss, um den Graphbuilder zu erstellen (ich muss N Zeilen mit „legend box(properties(0...N)“) versenden. Wenn ich jedoch ein Diagramm mit N+1 Zeilen im Legendenfeld erstelle, funktioniert es teilweise (die N+1. Zeile wird nicht geändert). Daher muss ich eine Schleife erstellen, entweder innerhalb des Skripts, das den Graphbuilder erstellt (ist das machbar?) oder nach dem Skript, das den Graphbuilder erstellt (es ist sinnvoller, aber ich kann keine Nachricht(en) finden, die ich an Legendbox senden kann). .
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingen1. Die Markierungen sind nummeriert, wie in der Tabelle unten zu sehen ist. Dies wurde durch ein Skript generiert, wie im Skripthandbuch gezeigt
Hilfe==>Bücher==>Skripthandbuch

Einigen Markierungen sind Namen zugewiesen, die Sie im Graph Builder-Skript gesehen haben. Ich kenne keine Auflistung dieser Namen, aber Sie können jederzeit interaktiv einen Graph Builder ausführen und die gewünschte Markierung zuweisen und dann das von ihm erstellte Skript anzeigen und prüfen, ob es Ihnen einen Namen und nicht nur eine Zahl gibt.
2. Die Legende wird in alphabetischer oder numerischer Reihenfolge aufgelistet, es sei denn, die Wertreihenfolge oder die Zeilenreihenfolgeebene ist aktiviert. Sie können dies programmgesteuert ermitteln und dann Ihren Code anpassen. Um das Alter in der Datentabelle herauszufinden, verwende ich am häufigsten die Funktion Summarize()
summary(dt,bygroup = By(:Age));
Die Variable „bygroup“ enthält eine Liste aller gefundenen Altersgruppen.
N Elemente (nach Gruppe);
Gibt Ihnen die Anzahl der gefundenen verschiedenen Altersgruppen an
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenDanke für die schnelle Antwort,
1/ Es kann funktionieren, vorausgesetzt, ich habe einen vollständigen Satz an Markernamen (ich habe in der Dokumentation die Standard-JMP-Farben gefunden). Wissen Sie, wo ich etwas Äquivalentes für Markernamen finden kann?
2/ Wenn Farben und Markierungen in diesem Fall in eine eigene Tabelle geschrieben werden, kann ich jede Zeile der Legende durch (eval(substitute(expr(graphbuilder(color1,marker1),expr(color1),mycolor, expr( marker1),mymarker))). Es funktioniert, ein schöner Fortschritt, aber ich muss die Nummer des Elements in der Legende kennen, um die Ersetzung vorzunehmen.
Um es für Dateien mit „großen Klassen“ klarer zu machen: Wenn die Überlagerung mit :AGE erstellt wird und ich die AGE(s) in der Datei nicht kenne, wie kann ich vorgehen?
Ich könnte es vielleicht in einer Schleife machen (nach dem Graph Builder), wenn ich eine Nachricht an die Legendbox senden könnte. Aber ich kann in der Dokumentation keine Meldungen finden, die das Element ändern ... Und schließlich ist der Baumknoten im Legendbox-Knoten „leer“.
Betreff: Legende mit Markierung und Farbe des Zeilenstatus erzwingenDie einfachste Möglichkeit, dies meiner Meinung nach für JMP zu handhaben, besteht darin, die Legende und damit das Diagramm mithilfe von JSL so zu ändern, dass sie Ihren Zeilenzuständen entsprechen. Hier ist ein Skript, das zeigt, wie die Legende in Graph Builder geändert wird.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" );
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1,
Properties( 0, {Marker( "FilledTall" )} ),
Properties( 1, {Line Color( 1 ), Line Style( "Dashed" ), Marker( "Filled Diamond" )} )
), Legend Model(
1,
Properties( 0, {Marker( "FilledTall" )} ),
Properties( 1, {Line Color( 1 ), Line Style( "Dashed" ), Marker( "Filled Diamond" )} )
)}
),
Dispatch( {}, "400", LegendBox, {Legend Position( {1, [2, 3], 1, [0, 1]} ), Position( {2, 3, 0, 1} )} )
)
);
Es ergibt Folgendes
