2013-10-08 3 views
1

Le titre est assez explicite mais voici une photo de ce que je voudrais faire. J'ai du mal à comprendre si c'est possible.Quelqu'un peut-il tracer un graphe de haricot dans gnuplot?

example bean plot

terrain emprunté à: évaluation des niveaux de fond géochimiques autour des mines de sulfure - Une nouvelle procédure statistique avec beanplots. Gusstavason et al. 2012.

Répondre

2

Faire le tracé exactement dans cette orientation pourrait être très lourd, si possible.

Ma suggestion est de tracer tout avec l'orientation habituelle (ie ayant l'axe « sédiments » comme x -axis, ou plutôt comme x2 -axis), tourner toutes les étiquettes un peu et enfin tourner la sortie complète par 90 degré (fichier pdf avec par exemple pdftk etc).

Avec cela, vous pouvez utiliser n'importe quel style de tracé comme d'habitude. Dans le script ci-dessous, je viens de vous montrer comment tracer les courbes remplies de violet et de jaune (en utilisant des pseudo-données) pour deux ensembles de données différents. Ajouter les autres pics devrait être simple (tracer les barres avec par exemple boxes ou vector style de traçage).

Afin d'avoir ytics distinctes pour les différentes parcelles, j'associé un certain y -value avec une certaine parcelle, 1=Water, ..., 4=Gyttja).

Mettre tout donne toghether le script suivant:

reset 
set terminal pdfcairo linewidth 2 
outfile='bean' 
set output outfile.'.pdf' 
set encoding utf8 

set x2range [0.5:9000] 
set logscale x2 
set x2tics (1, 5, 10, 50, '' 100, 500, '' 1000, 5000) out 
set x2label 'mg/kg (sediments), µg/L (water)' 
unset xtics 

set yrange[0.5:4.5] 
set ytics ('Water' 1, 'Minerogenic' 2, 'Peat' 3, 'Gyttja' 4) center rotate by -90 out 

set label at graph 0.95, graph 0.05 right rotate by -90 'Nickel' font ',20' front 
# cover possible data overlapping with the label 
set object rectangle from graph 0.9, graph 0 to graph 1,graph 0.2 fillcolor rgb 'white' fillstyle solid noborder front 

unset key 

set macros 
fs1="fillcolor rgb '#fc9e00' linewidth 2 fillstyle solid border lt -1" 
fs2="fillcolor rgb '#9119f7' linewidth 2 fillstyle solid border lt -1" 
# use pseudo data 
set samples 500 
plot '+' using 1:(4-0.3*exp(-(($1-10)/5.0)**4)) axes x2y1 with filledcurves y1=4 @fs1,\ 
    '' using 1:(4+0.2*exp(-(($1-70)/50.0)**4)) axes x2y1 with filledcurves y1=4 @fs2,\ 
    '' using 1:(1-0.4*exp(-(($1-5)/2.0)**2)) axes x2y1 with filledcurves y1=1 @fs1,\ 
    '' using 1:(1+0.1*exp(-(($1-30)/20.0)**2)) axes x2y1 with filledcurves y1=1 @fs2 

set output 
system(sprintf('pdftk %s.pdf cat 1W output %s-rot.pdf', outfile, outfile)) 
system(sprintf('pdftocairo -r 150 -png %s-rot.pdf', outfile)) 

Cela donne (classique et mis en rotation de sortie côte à côte) avec 4.6.3:

enter image description here

Quelques trucs est nécessaire pour les pseudo-données. Pour un vrai fichier de données, la ligne de tracé est un peu différente. Les différentes parcelles ont une séparation de 1 dans y -direction, vous devez donc l'échelle de vos données en conséquence (fait ici manuellement avec un facteur d'échelle sc):

sc = 5.1 
plot 'datafile.txt' using 1:(4 + $2/sc) axes x2y1 with filledcurves y1=4 @fs1 

Vous pouvez bien sûr faire aussi mise à l'échelle automatique, par extraction certaines valeurs minimales/maximales à l'aide de la commande stats.

+0

Merci beaucoup pour votre point de départ. Et l'orientation n'est pas un problème, j'ai juste besoin d'afficher plusieurs distributions les unes à côté des autres pour pouvoir les comparer. – dstorey

Questions connexes