Organisation der KreisdiagrammbeschriftungenHallo,
Ich versuche, in der Community nach meiner Antwort zu suchen, konnte es aber nicht.
Ich habe ein Skript, das einen monatlichen Bericht als Kreisdiagramm erstellt. Ich habe die Beschriftungen auf der ersten Seite verschoben, um sie lesbarer zu machen, und die Position in mein Skript kopiert. Dies funktioniert, wenn dieselben Daten verwendet werden, die Aufteilung der Daten jedoch über Monate hinweg nicht gleich ist, sodass sich die Beschriftungen erneut überschneiden.
Gibt es eine Möglichkeit, Verbindungslinien zwischen dem Kreisabschnitt und den Daten einzurichten, sodass diese über den Kreis verteilt werden können und gleichzeitig sichtbar bleiben, ohne sich zu überlappen? Ich verwende JMP 16 bis 18.
Vielen Dank für Ihre HilfeDatenexploration und -visualisierungErgebnisse teilen und kommunizierenWindowsBetreff: Organisation der KreisdiagrammbeschriftungenIch kenne keine Möglichkeit, solche Linien einfach zum Kreisdiagramm hinzuzufügen. Sie können diese Linien berechnen und mit einem Skript hinzufügen oder einige Berechnungen durchführen und die Versätze per Skript festlegen.
Betreff: Organisation der KreisdiagrammbeschriftungenDanke @jthi .
Da sich meine Daten jeden Monat ändern und nicht immer alle Kategorien vorhanden sind, fällt es mir schwer, das alles zu kodieren, selbst der Offset gilt möglicherweise nicht für jeden Monat.
Alternativ kann ich die Beschriftungen auf Abschnitten des Kreisdiagramms anbringen und den Abstand zur Mitte des Kreises ändern, um sicherzustellen, dass sie sich nicht überlappen. Wissen Sie, ob die Option vorhanden ist, oder muss ich das per Skript ausführen?
Danke noch einmalBetreff: Organisation der KreisdiagrammbeschriftungenIch würde höchstwahrscheinlich etwas anderes als ein Kreisdiagramm verwenden (viel einfacher, als mit der Skripterstellung für Kreissegmente zu beginnen, selbst die Dokumentation im Scripting Index ist in den meisten Fällen dafür falsch ...), aber das scheint eine schöne Herausforderung zu sein, also werde ich es tun Versuchen Sie, eine Art Skript dafür zu schreiben.
Betreff: Organisation der KreisdiagrammbeschriftungenVielen Dank. Ich kann es auch versuchen, aber ich denke, du wirst viel schneller sein als ich.
Ich habe versucht, meine Vorgesetzte dazu zu bringen, ihre Meinung zu einer anderen grafischen Darstellung zu ändern, aber sie möchte leider ein Kreisdiagramm :pensive_face:, das ist nicht mein Favorit.
Ich werde auch etwas auf die Wunschliste schreiben, denn es stimmt, dass der Scripting-Index dafür nicht gut ist.
Danke noch einmalBetreff: Organisation der KreisdiagrammbeschriftungenSchade, dass Sie das Kreisdiagramm nicht loswerden können (die meist überstrapazierte und meist schlechte Möglichkeit, etwas zu visualisieren). Unten ist ein Skript, das vielleicht eine Vorstellung davon gibt, was Sie tun könnten. Die Berechnungen sind definitiv nicht optimal, aber sie könnten funktionieren (ich erinnere mich nicht mehr wirklich an Einheitskreis und Trigonometrie).
Names Default To Here(1);
ADJUSTED_LOCATION = 0.8 ; // default is 1
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:age), Y(:height)),
Elements(Pie(X, Y, Legend(2), Summary Statistic("Sum"), Label("Label by Value")))
);
fb = Report(gb)[FrameBox(1)];
pie = fb << Find Seg("Pie Seg");
{x_origo, y_origo} = pie << Get Origin;
radius = pie << Get Radius;
Summarize(dt, groups = By(:age), sums = Sum(:height)); // we must know summary statistic used in pie chart
r_sections = Reverse((sums / Sum(sums)) * 2 * Pi());
angles = {};
For Each({section, idx}, r_sections,
angle = (section + Pi()) / 2;
If(idx > 1,
angle = angle + Sum(r_sections[1::idx - 1]);
);
Insert Into(angles, angle);
);
label_locations = {};
For Each({angle, idx}, angles,
i = N Items(angles) - idx;
xcoord = x_origo + ADJUSTED_LOCATION * Cos(angle);
ycoord = y_origo + ADJUSTED_LOCATION * Sin(angle);
location = Eval List({i, xcoord, ycoord});
Insert Into(label_locations, Eval List({location}));
);
For Each({location}, label_locations,
Eval(EvalExpr(
pie << Set Label Offset(Expr(location));
));
);
Standard

ADJUSTED_LOCATION = 0,8

ADJUSTED_LOCATION = 1.1

Dies könnte in eine Funktion umgewandelt werden, die in der Lage wäre, Zeilen zu den Etiketten hinzuzufügen.
Betreff: Organisation der KreisdiagrammbeschriftungenIch stimme den anderen Kommentaren zu: Verwenden Sie keine Kreisdiagramme. Ich bin in diesem Punkt nachdrücklicher als andere. Aber hier ist eine sehr gute Präsentation, die veranschaulicht, warum es immer besser ist, ein Balkendiagramm (oder ähnliche Alternativen) als ein Kreisdiagramm zu verwenden: https://speakerdeck.com/cherdarchuk/data-looks-better-naked-pie-chart-edition . Ich würde dies als Gelegenheit sehen, Ihren Vorgesetzten zu schulen.
Betreff: Organisation der KreisdiagrammbeschriftungenWow, du warst so schnell!
Vielen Dank, Jarmo, das erledigt den Job perfektBetreff: Organisation der KreisdiagrammbeschriftungenHallo @dlehman1 ,
Danke für den Link. Ich werde versuchen, sie zu belehren, aber sie haben ziemlich starke Gefühle für Kreisdiagramme. Ich werde die Parallele zu anderen Visualisierungen ziehen, um zu versuchen, sie zu überzeugen.
Betreff: Organisation der KreisdiagrammbeschriftungenBeispiel, wie Zeilen hinzugefügt werden könnten
Names Default To Here(1);
ADJUSTED_LOCATION = 1 ; // default is 1
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:age), Y(:height)),
Elements(Pie(X, Y, Legend(2), Summary Statistic("Sum"), Label("Label by Value")))
);
calculate_pie_graph_angles = Function({gb}, {Default Local},
dt = gb << Get Data Table;
// Get X and Y columns (doesn't currently support Overlay)
vars = gb << Get Variables;
xcol = Empty();
ycol = Empty();
For Each({var}, vars,
role = var["Role"];
If(role == "X",
xcol = Arg(var, 1) << get name; // I don't use references
, role == "Y",
ycol = Arg(var, 1) << get name; // I don't use references
);
);
// Get summary statistic
elements = gb << Get Elements(1, 1);
summary_stat = Try(elements[1]["Summary Statistic"], "Mean"); // We assume Mean is the default one
// Calculate groups and segments
// I'm lazy and use Evil Parse here
stat = Eval Insert("^summary_stat^(Eval(ycol))");
Eval(EvalExpr(
dt_summary = dt << Summary(
Group(Eval(xcol)),
Expr(Parse(stat)),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0),
invisible
);
));
groups = dt_summary[0, 1]; // 2 is N Rows
stats = dt_summary[0, 3];
Close(dt_summary, no save);
// calculate segments
r_sections = Reverse((stats / Sum(stats)) * 2 * Pi());
angles = {};
For Each({section, idx}, r_sections,
angle = (section + Pi()) / 2;
If(idx > 1,
angle = angle + Sum(r_sections[1::idx - 1]);
);
Insert Into(angles, angle);
);
Return(Reverse(angles));
);
get_segment_locations = Function({pie, angles, radius = 1}, {Default Local},
{x_origo, y_origo} = pie << Get Origin;
pie_radius = pie << Get Radius;
label_locations = {};
For Each({angle, idx}, angles,
i = idx - 1;
xcoord = x_origo + radius * Cos(angle);
ycoord = y_origo + radius * Sin(angle);
location = Eval List({i, xcoord, ycoord});
Insert Into(label_locations, Eval List({location}));
);
return(label_locations);
);
fb = Report(gb)[FrameBox(1)];
pie = fb << Find Seg("Pie Seg");
angles = calculate_pie_graph_angles(gb);
offsets1 = get_segment_locations(pie, angles, 1.05);
For Each({location}, offsets,
Eval(EvalExpr(
pie << Set Label Offset(Expr(location));
));
);
offsets2 = get_segment_locations(pie, angles, 0.9);
offsets3 = get_segment_locations(pie, angles, 1.02);
For Each({{start, end}}, Across(offsets2, offsets3),
Eval(EvalExpr(
x = start[2] || end[2];
y = start[3] || end[3];
fb << Add Graphics Script(
Line(
Expr(x), Expr(y)
);
);
));
);
