Histogram Gnuplot mengen Gegroepeerde / Stacked

stemmen
0

Ik heb een histogram consisiting in 4 kolommen. Ik wil ze geclusterd in paren om twee geclusterde groep gemaakt van twee gestapelde kolommen hebben.

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

met mijn dossier 'data' als volgt georganiseerd

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

Ik verkregen net een eenvoudige gestapelde diagram met alle kolommen gescheiden door elkaar

voer

De vraag is gesteld op 02/12/2019 om 23:52
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Het volgende kan een uitgangspunt voor verdere tweaken zijn. Ik probeerde het algemeen te houden, zodat u gemakkelijk meer kolommen of rijen kunnen toevoegen.

In uw code u een opsomming van de waarden van de kolom "handmatig" $2+$3+$4. Er zijn zeker manieren op te sommen kolommen "automatisch". Maar, liet ik me om uw gegevens om te zetten, want ik vond het gemakkelijker. Laat me weten als je kan leven met het. Omdat gnuplot heeft geen transpositie functie, ofwel moet je het uit te voeren jezelf of gebruik maken van externe software. De laatste, ik meestal probeer te vermijden als gevolg van platform-onafhankelijkheid. Ik denk dat er is ook een manier om hetzelfde perceel voor uw oorspronkelijke data te doen.

Ik verkies de plotten stijl with boxxyerrorin plaats van with boxesdat wordt altijd vanaf nul. Eigenlijk is de laatste plot commando niets plotten, maar gewoon om een of andere manier de legenda. Dit is nog steeds niet optimaal. Een aanvullende verklaring kunnen worden toegevoegd die je vertelt welke stapel Data1 en dat is 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

Resultaat:

voer image beschrijving hier

antwoordde op 05/12/2019 om 17:58
bron van user

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