2016-04-22 15 views
5

Input:Wie ein Kreisdiagramm von GNUPlot erstellt ändern

Ich habe eine myfile.csv-Datei, die die folgenden Informationen hat:

Shift,Percentage 
Day Shift, 39.94 
Night Shift, 60.06 

GNUPlot Verarbeitung:

Die myfile.csv Datei ist die pie_chart_generator.gnuplot Datei gefüttert, die ist:

#!/usr/bin/gnuplot -persist 
reset 
set title "\n" 
set label 1 "My Pie Chart\nShift Usage Break Down" at graph 0,1.125 left 
set terminal wxt 
unset key 
set datafile separator "," 
set terminal png 
set size square 
set output "piechart.png" 
stats 'myfile.csv' u 2 noout  # get STATS_sum (sum of column 2) 

ang(x)=x*360.0/STATS_sum  # get angle (grades) 
perc(x)=x*100.0/STATS_sum  # get percentage 

#set size square     # square canvas 
set xrange [-1:1.5] 
set yrange [-1.25:1.25] 
set style fill solid 1 

unset border 
unset tics 
unset key 

Ai = 0.0; Bi = 0.0;    # init angle 
mid = 0.0;      # mid angle 
i = 0; j = 0;     # color 
yi = 0.0; yi2 = 0.0;   # label position 


plot 'myfile.csv' u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i=i+6) with circle linecolor var 

und wurde damit als reference erstellt.

Aktuelle Ausgabe der Chart:

Dieser Code generiert diese Kreisdiagramm: Output .png pie chart

Fragen:

Q1: Wie kann ich Farben zu jedem der Sektoren zuweisen der Grafik im RGB-Format? Q2: Gibt es eine Möglichkeit, die Etiketten in der rechten Ecke zu platzieren? Q3: Wie kann ich den Wert auf dem Diagramm platzieren?

Ideal Ausgabe von Chart: enter image description here

Nachtrag:

ich weiter meinen Code mit Hilfe der Antwort verbessert haben. Der Code in der Antwort war nicht ruhig Arbeit für mich so hatte ich es zu zwicken:

#!/usr/bin/gnuplot -persist 
reset 

dataname = 'myfile.csv' 
set datafile separator ',' 

# Get STATS_sum (sum of column 2) and STATS_records 
stats dataname u 2 noout 

# Define angles and percentages 
ang(x)=x*360.0/STATS_sum  # get angle (grades) 
perc(x)=x*100.0/STATS_sum  # get percentage 

# Set Output 
set terminal png 
set output "piechart.png" 
set size square 

# Print the Title of the Chart 
set title "\n" 
set label 1 "My Pie Chart\nShift Usage Break Down" at graph 0,1.125 left 

#set terminal wxt 
unset key 
set key off 

set xrange [-1.5:1.5] 
set yrange [-1.5:1.5] 
set style fill solid 1 

unset border 
unset tics 
unset colorbox 

# some parameters 
Ai = 5.0;      # Initial angle 
mid = 0.0;     # Mid angle 

# This defines the colors yellow~FFC90E, and blue~1729A8 
# Set palette defined (1 '#FFC90E', 2 '#1729A8')    # format '#RRGGBB' 
set palette defined (1 1 0.788 0.055, 2 0.090 0.161 0.659) # format R G B (scaled to [0,1]) 


plot for [i=1:STATS_records] dataname u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::2 with circle linecolor palette,\ 
     dataname u (mid=(Ai+ang($2)), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.2f\%', $2, perc($2))) w labels center font ',10',\ 
     for [i=1:STATS_records]dataname u (1.45):(i*0.25):1 every ::1 with labels left,\ 
     for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 5 ps 4 lc palette 

# first line plot semicircles: (x):(y):(radius):(init angle):(final angle):(color) 
# second line places percentages: (x):(y):(percentage) 
# third line places the color labels 
# fourth line places the color symbols 
unset output 

Stromausgang von Chartaus dem Code oben:

enter image description here

Nachtrag Fragen:

Q4: Ich habe massive Schwierigkeiten mit den Etiketten/Titeln. Ich habe versucht, den Code in der Antwort habe ich das gleiche Ergebnis. Wie kann ich die Titel drucken, ohne übereinander zu drucken?

+1

Nur ein Kommentar: Sie änderte die erste 'Plot für [i] ... jeder :: i-1 :: i-1' Zeile zu 'jeder :: 2'. Auf diese Weise zeichnest du das Tortendiagramm ** zweimal **, weil du für jeden Wert von 'i' ('für [i = 1: 1] die gesamten Daten liest (' every :: 2' liest von Zeile 2 bis zum Ende) Aufzeichnungen] '). Deshalb sehen Sie überlappende Titel. Ich würde etwas wie "Plot für [i = 1: STATS_records] ... jedes :: i :: i" schreiben. Bitte sehen Sie meine Bearbeitung am Ende meiner Antwort. – vagoberto

+0

@vagoberto ja! das hat den Trick gemacht! weil für andere Werte als die Probe eins - es war nicht das Zeichnen der Torte als einen vollen Kreis, sondern eher wie Pacman mit seinem Mund offen ( 3kstc

+0

Ich würde die Gemeinde erneut höflich darum bitten, die Frage abzustimmen, da ich eine eigene Prämie geteilt habe, um nicht nur mich selbst, sondern die Gemeinschaft zu unterstützen – 3kstc

Antwort

2

Die post you cited hat bereits eine Möglichkeit vorgeschlagen, die Beschriftungen und Prozentwerte zu platzieren. Lassen Sie mich die Schritte Punkt für Punkt erklären, um dieses Ziel zu erreichen. Am Ende schreibe ich das vollständige Skript.

Q3: Wie kann ich den Wert auf dem Diagramm platzieren?

Jede Scheibe wird in zwei Winkeln definiert (Ai,Af). Die Prozentwerte sollten in der Mitte von jedem unter (x,y)=(0.5*cos(mid), 0.5*sin(mid)) platziert werden, wobei mid=0.5*(Ai+Af) der Mittelpunktswinkel und 0.5 der halbe Radius des Kreisdiagramms ist.

Zum ersten Eintrag wir Ai=0 und der Winkel einstellen wird Af als Af=ang($2) von Daten berechnet, wobei ang(x) in Ihrem Skript definiert ist. Für den zweiten Eintrag aktualisieren wir Ai=Af und berechnen erneut Af=ang($2), und so weiter.

Schließlich sollte die folgende Zeile die Prozentsätze Platz:

plot 'myfile.csv' u (mid=Ai+ang($2), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.2f\%', $2, perc($2))) every ::1 w labels center font ',10' 

Anmerkung:, dass die erste Klammer (mid=Ai+ang($2), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)) die Winkel Ai und mid berechnet (Af ist eigentlich nicht erforderlich), und dann die Erträge Koordinaten x=-0.5*cos(mid) .

Caveat: beide x und y-Achse muss haben die gleichen Bereiche:

set xrange [-1.5:1.5] 
set yrange [-1.5:1.5] 

Q2: Gibt es eine Weise, die ich die die Etiketten auf der rechten Ecke platzieren können?

Für die farbigen Quadrate, können Sie Punkte in festen x plotten, und in gleichem Abstand y-Werte mit:

for [i=1:STATS_records] '+' using (1.3):(i*0.25):(i) pt 5 ps 4 linecolor palette 

wo STATS_records die Anzahl der Zeilen der Datei ist (die Sie bereits berechnet mit stats 'myfile.csv'). Diese Zeile verwendet eine Pseudodatei '+' und die verwendete Spezifikation hat drei Spalten (x):(y):(color), wobei x=1.3 fest, y=i*0.25 für i=1,2,3,...,STATS_records und color=i von linecolor palette verwendet wird. Die Punkte sind gefüllte Quadrate (pt 5) mit 4 Pixeln Länge (ps 4). Die Farben werden in der gleichen Reihenfolge wie die jeweiligen Kuchenscheiben gezeichnet.

plot for [i=1:STATS_records] 'myfile.csv' u (1.45):(i*0.25):1 every ::i::i with labels center font ',10' 

, wo die Verwendung von spec Spalten (x):(y):(name):

Die Etiketten jeder Farbe kann mit gezogen werden. Der Wert x=1.45 ist etwas größer als der zuvor verwendete Wert und y=i*0.25 muss mit denen der farbigen Quadrate identisch sein. name=$1 extrahieren Sie die Zeichenfolge aus Spalte 1, die von with labels verwendet wird.

Hinweis: Sie können die Schriftart und Größe der Etiketten mit with labels font 'Arial,10' steuern. Sie können den Namen der Schriftart als font ',10' weglassen.

Q1: Wie kann ich Farben zu jedem der Sektoren des Graphen im RGB-Format zuweisen?

Im letzten Befehl, verwende ich linecolor palette, so dass wir die Farben mit

set palette defined (1 1 0.788 0.055, 2 0.090 0.161 0.659) 

wo ich die Farben in RGB, skaliert auf [0,1] (gelb-like definieren 1 0,788 0,055; blauähnlich ist 0,090 0,161 0,659).

Hinweis: Das Tortendiagramm sollte jetzt mit ziehen:

plot for [i=1:STATS_records] dataname u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::i-1::i-1 with circle linecolor palette 

Dies ist, was ich mit Ihren Daten erhalten

pie-chart

Dies ist die vollständige Skript:

#!/usr/bin/gnuplot -persist 
reset 

dataname = 'myfile.csv' 
set datafile separator ',' 

# get STATS_sum (sum of column 2) and STATS_records 
stats dataname u 2 noout  

#define angles and percentages 
ang(x)=x*360.0/STATS_sum  # get angle (grades) 
perc(x)=x*100.0/STATS_sum  # get percentage 

# output 
set terminal png 
set output 'piechart.png' 
set size square 

set title "\n" 
set label 1 "My Pie Chart\nShift Usage Break Down" at graph 00.5,0.95 left 

set xrange [-1.5:2.5]  # length (2.5+1.5) = 4 
set yrange [-2:2]   # length (2+2) = 4 
set style fill solid 1 

# unset border   # remove axis 
unset tics    # remove tics on axis 
unset colorbox   # remove palette colorbox 
unset key     # remove titles 

# some parameters 
Ai = 15.0;    # init angle 
mid = 0.0;    # mid angle 

# this defines the colors yellow~FFC90E, and blue~1729A8 
# set palette defined (1 '#FFC90E', 2 '#1729A8')  # format '#RRGGBB' 
set palette defined (1 1 0.788 0.055, 2 0.090 0.161 0.659) # format R G B (scaled to [0,1]) 


plot for [i=1:STATS_records] dataname u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::i::i with circle linecolor palette,\ 
    dataname u (mid=(Ai+ang($2)), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.2f\%', $2, perc($2))) ever\ 
y ::1 w labels center font ',10',\ 
    for [i=1:STATS_records] dataname u (1.45):(i*0.25):1 every ::i::i with labels left,\ 
    for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 5 ps 4 lc palette  

# first line plot semicircles: (x):(y):(radius):(init angle):(final angle):(color) 
# second line places percentages: (x):(y):(percentage) 
# third line places the color labels 
# fourth line places the color symbols 
unset output 

Update: Das Original myfile.csv hat eine Kopfzeile (die erste Zeile Shift,Percentage), die Gnuplot nicht richtig lesen. Wir können diese Zeile ignorieren, indem sie zu kommentieren (füge einen # Charakter, zB # Shift,Percentage) oder einen every Befehl an 1 in den Plotlinien beginnend zu platzieren:

plot for [i=1:STATS_records] dataname u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::i::i with circle linecolor palette,\ 
    dataname u (mid=(Ai+ang($2)), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.2f\%', $2, perc($2))) ever\ 
y ::1 w labels center font ',10',\ 
    for [i=1:STATS_records] dataname u (1.45):(i*0.25):1 every ::i::i with labels left,\ 
    for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 5 ps 4 lc palette 
+0

Danke für die umfassende Erklärung - der Code didn 't arbeiten zuerst gehen, so dass ich es ein bisschen zwickte. Ich habe derzeit das Problem mit den Titeln - Ich habe eine detaillierte Beschreibung zu Frage hinzugefügt - Könnten Sie mir bitte helfen? – 3kstc

+0

Ich änderte die vorletzte 'für' zu' für [ i = 1: STATS_records] Dataname u (1.45) :(i * 0.25): 1 jedes :: i :: i mit links, \ ' – 3kstc

+0

Ich bin immer noch ein bisschen unruhig mit GNUPlot. Ich habe' Grenze gesetzt 'und versucht einige Sachen von [GuidoLabs] (http://labs.guidolin.net/2010/03/how-to-create-beautiful-gnuplot-graphs.html) aber Ich möchte einen Rahmen um das ganze Bild erstellen, damit der Titel und die Legende innerhalb der Grenze sitzen - Wie könnte ich das tun? – 3kstc

2

durch Zwicken und Verwendung Vagobertos gut erklärt Code (weil der Code nicht für mich arbeiten) und weiterführende Literatur zu tun, mein Code wie folgt:

GNUPlot Code:

#!/usr/bin/gnuplot -persist 
reset 

dataname = 'myfile.csv' 
set datafile separator ',' 

# Get STATS_sum (sum of column 2) and STATS_records 
stats dataname u 2 noout 

# Define angles and percentages 
ang(x)=x*360.0/STATS_sum  # get angle (grades) 
perc(x)=x*100.0/STATS_sum  # get percentage 

# Set Output 
set terminal png 
set output "piechart.png" 
set size square 

# Print the Title of the Chart 
set title "\n" 
set label 1 "My Pie Chart\nShift Usage Break Down" at graph 0,1.125 left 

#set terminal wxt 
unset key 
set key off 

set xrange [-1.5:1.5] 
set yrange [-1.5:1.5] 
set style fill solid 1 

unset border 
unset tics 
unset colorbox 

# some parameters 
Ai = 5.0;      # Initial angle 
mid = 0.0;     # Mid angle 

# This defines the colors yellow~FFC90E, and blue~1729A8 
# Set palette defined (1 '#FFC90E', 2 '#1729A8')    # format '#RRGGBB' 
#set palette defined (1 1 0.888 0.055, 2 0.156 0.455 0.651) # format R G B (scaled to [0,1]) 


set palette defined (1 0.961 0.690 0.255, 2 0.180 0.525 0.757) # format R G B (scaled to [0,1]) 

plot for [i=1:STATS_records] dataname u (0):(0):(1):(Ai):(Ai=Ai+ang($2)):(i) every ::i::i with circle linecolor palette,\ 
     dataname u (mid=(Ai+ang($2)), Ai=2*mid-Ai, mid=mid*pi/360.0, -0.5*cos(mid)):(-0.5*sin(mid)):(sprintf('%.2f\%', $2, perc($2))) w labels center font ',16',\ 
     for [i=1:STATS_records]dataname u (1.45):(i*0.25):1 every ::i::i with labels left font 'Arial-Bold,10',\ 
     for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 5 ps 4 linecolor palette 


# *************************************************** +--------------------   shape code= 
#  for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 8 ps 4 linecolor palette   # empty triangle 
#  for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 9 ps 4 linecolor palette   # solid triangle 
#  for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 7 ps 4 linecolor palette   # solid circle 
#  for [i=1:STATS_records] '+' u (1.3):(i*0.25):(i) pt 6 ps 4 linecolor palette   # empty circle 


# first line plot semicircles: (x):(y):(radius):(init angle):(final angle):(color) 
# second line places percentages: (x):(y):(percentage) 
# third line places the color labels 
# fourth line places the color symbols 



unset output 

Die Ausgabe Piechart:

Verwandte Themen