Histogram Gnuplot Mischen Clustered / Stacked

stimmen
0

Ich habe ein Histogramm in 4 Spalten consisiting. Ich möchte sie in Paaren gruppierten zwei gruppierten Gruppe von zwei gestapelte colums gemacht haben.

set terminal epslatex standalone color size 4.0in,3.0in background rgb white
set output 'hist.tex'
set boxwidth 0.5 absolute
unset key
set style fill  solid 1.00 border lt -1
set style increment default
set style histogram rowstacked title textcolor lt -1
set style data histograms
set yran [0:10]
plot for [COL=2:4] 'data' using COL title columnheader

mit meiner Datei als organisiert ‚Daten‘ folgt

c1 c2 c3 c4
M1 5 1 1
M1 1 3 5
M2 1 1 1
M2 2 2 2

Ich erhielt nur eine einfache Stapeldiagramm mit allen, die von einander getrennt Spalten

Geben

Veröffentlicht am 02/12/2019 um 23:52
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Im Folgenden kann ein Ausgangspunkt für weitere Optimierungen sein. Ich versuchte es allgemein zu halten, so dass Sie leicht mehr Spalten oder Zeilen hinzufügen können.

In Ihrem Code sind Summieren Sie die Spaltenwerte „manuell“ nach oben $2+$3+$4. Es gibt sicherlich Möglichkeiten , Spalten zu summieren „automatisch“. Aber ich ließ mich um Ihre Daten transponieren, weil ich es leichter gefunden. Lassen Sie uns wissen , wenn Sie mit ihm leben können. Da gnuplot keine transponieren Funktion hat, haben Sie entweder es selbst zu implementieren oder externe Software. Letztere, versuche ich in der Regel wegen der Plattformunabhängigkeit zu vermeiden. Ich denke , es auch eine Möglichkeit, die gleiche Handlung für die Originaldaten zu tun.

Ich ziehe das Plotten Stil with boxxyerrorstatt with boxesdem Start immer von Null. Eigentlich ist der letzte Plotbefehl nichts Plotten aber nur immer irgendwie die Legende. Dies ist immer noch suboptimal. Eine weitere Erklärung könnte hinzugefügt werden , die Ihnen sagt , welche Stapel ist Data1 und welches ist Data2.

Code:

### Histogram stacked and grouped
reset session

$Data1 <<EOD
area  "ex 1"  "ex 2"  "ex 3"
par1  0       0       0.119
par2  0.0211  0.0302  0
par3  0.0078  0.0139  0.0169
EOD

$Data2 <<EOD
nr    "ex 1"  "ex 2"  "ex 3"
par1  0       0       0.211
par2  0.0233  0.0302  0
par3  0.0083  0.0151  0.0173
EOD

set key top left
set style fill solid border -1

Cols = 3
Groups = 2
GroupGap = 0.2
BoxScale = 0.9
BoxWidth = (1.0-GroupGap)/Groups
Offset(g,i) = i-1.5+GroupGap/2.0 + BoxWidth/2 +(g-1)*BoxWidth

myXtic(i) = columnhead(i)
BoxL(g,i) = Offset(g,i)-BoxWidth/2.*BoxScale
BoxR(g,i) = Offset(g,i)+BoxWidth/2.*BoxScale
set xrange [0.5:Cols+0.5]

array myPalette[6] = [0xff0000, 0x00ff00, 0x0000ff, 0xffaaaa, 0xaaffaa, 0xaaaaff]
myColors(n) = myPalette[n+1+(g-1)*3]

set table $Legend
    plot $Data1 u (strcol(1)) w table
unset table

plot \
    for [i=2:Cols+1] $Data1 u (g=1,i-1):(int($0)?sum:sum=0):\
      (BoxL(g,i)):(BoxR(g,i)):(sum):(sum=sum+column(i)):(myColors($0)) \
      skip 1 w boxxy lc rgb var not, \
    for [i=2:Cols+1] $Data2 u (g=2,i-1):(int($0)?sum:sum=0):\
      (BoxL(g,i)):(BoxR(g,i)):(sum):(sum=sum+column(i)):(myColors($0)) \
      skip 1 w boxxy lc rgb var not, \
    for [i=2:|$Legend|] $Data1 u (g=1,i-1):(NaN):(myColors(i-2)): \
      xtic(columnhead(i)) w boxes lc rgb var ti word($Legend[i],1)
### end of code

Ergebnis:

Geben Sie hier image description

Beantwortet am 05/12/2019 um 17:58
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more