不同缩放的y轴之间Filledcurves

问题描述 投票:2回答:2

我要“重塑”类似下面的图:

我的问题是,在“filledcurves”选项不能正常工作,如果我用不同的缩放的Y轴。

set y2tics textcolor rgb "black" 
set ytics nomirror
set yrange [0:80]
set y2range [0:180]
set key off
set grid dashtype 5 # auch dt ".-." möglich
plot "klima_flach.txt" using 1:3:4 with filledcurves x1,\
     "" using 1:4 with lines axis x1y2,\
     "" using 1:3:xtic(2) with lines axis x1y1

所使用的数据如下:

0 0 11 50  
1 J 10 70  
2 F 11 42  
3 M 12 50  
4 A 15 50  
5 M 18 20  
6 J 22 10  
7 J 25 1  
8 A 25 20  
9 S 23 40  
10 O 20 80  
11 N 25 70  
12 D 11 60  

任何想法,我怎么能得到这个问题解决了吗?

顺便说一句:一种图案为原始图......可能还是没有?

gnuplot
2个回答
0
投票

@WolfgangHÖFER,在这种类型瓦尔特/就伏气候图的轴线之间的比例为2。因此,你的y范围应为[0:90],因此缩放因子90./180。不过,我认为@克里斯托夫的回答解决你的问题。

为了您的最后一个问题:一个图案,在您的图片,即垂直填充图案?这就是我最近在这里问(Hatch patterns in gnuplot)。显然,这似乎不是在gnuplot的可能。

前一段时间,我也“奋斗”气候图,即具有filledcurves甚至非线性轴。我想提供我最终的代码。也许这将是对你有用,或者与他人的gnuplot得出这样的气候图。如果你是从文件中读取,用你的文件名替换$DataIn。建议和改进的欢迎。

# Walter/Lieth climate diagram with nonlinear axis
reset session
set encoding "utf8"

$DataIn <<EOD
# Mumbai/India, 18°54'N/72°49'E, 11 m
# No. Month Temperature Precipitation
1 January 23.9 3
2 February 23.9 3
3 March 26.1 3
4 April 28.1 2
5 May 29.7 18
6 June 28.9 485
7 July 27.2 617
8 August 27.0 340
9 September 27.0 264
10 October 28.1 64
11 November 27.2 13
12 December 25.6 3
EOD

# in order to be flexible for different input files 
ColTemp = 3     # col# temperature
ColPrec = 4     # col# precipitation

# get location label from first commented row starting after '# '
set datafile commentschar ""   # set the comment char to none
set datafile separator "\n"    # data will be a full line
set table $Dummy               # plot following data to a dummy table
    # plots only first line 'every ::0::0' as string to the dummy table
    # and assigns this line starting after the 3rd character to variable 'Location'
    plot $DataIn u (Location = stringcolumn(1)[3:]) every ::0::0 with table
unset table                    # stop plotting to table
set datafile commentschar "#"       # restore default commentschar
set datafile separator whitespace   # restore default separator
set label 1 at graph 0.02,0.96 Location font ",10"    # put label on graph

# set periodic boundaries, i.e. add lines of Dec and Jan again
# independent of the input format $DataIn, column1 of $Data will be the number of month
set datafile separator "\n"
set table $Data
    plot $DataIn u (0):(stringcolumn(1)) every ::11::11 with table
    plot $DataIn u ($0+1):(stringcolumn(1)) with table
    plot $DataIn u (13):(stringcolumn(1)) every ::0::0 with table
unset table
set datafile separator whitespace
# print $Data

# settings for nonlinear scale
ScaleChangeAt = 100.
ScaleChangeFactor = 5.
f1(y) = (y<=ScaleChangeAt) ? y : ((y - ScaleChangeAt)/ScaleChangeFactor + ScaleChangeAt)
f2(y) = (y<=ScaleChangeAt) ? y : ((y - ScaleChangeAt)*ScaleChangeFactor + ScaleChangeAt)
f3(y) = f1(y)/2.   # relation between axes y and y2; standard for Walter/Lieth climate diagrams
set nonlinear y2 via f1(y) inverse f2(y)


# settings for x-axis
set xrange[0.5:12.5]
set xtics 1 scale 0,1
set mxtics 2
set grid mxtics
# create months labels from local settings 
do for [i=1:12] {
    set xtics add (strftime("%b",strptime("%m",sprintf("%g",i))) i) 
}

# settings for y- and y2-axes
stats [*:*] $DataIn u ColTemp:ColPrec nooutput
Round(m,n) = int(m/n)*n + sgn(m)*n
Ymin = STATS_min_x > 0 ? 0 : Round(STATS_min_x,10)
Ymax = 50
Y2min = Ymin < 0 ? f1(Ymin)*2 : 0
Y2max = Round(STATS_max_y,10**int(log(STATS_max_y)/log(10))) # round to next 10 or 100
# print Ymin, Ymax, Y2min, Y2max

# y-axis
set ylabel "Temperature / °C" tc rgb "red"
set yrange [Ymin:f3(Y2max)]  # h(Y2max)]
set ytics 10 nomirror tc rgb "red"
# "manual" setting of ytics, up to 50°C
set ytics ("0" 0)
do for [i=Ymin:50:10] {
    set ytics add (sprintf("%g",i) i)
}

# settings for y2-axis
set y2label "Precipitation / mm" tc rgb "blue"
set y2range [Y2min:Y2max]
# "manual" setting of y2tics
set y2tics nomirror tc rgb "blue"
set y2tics ("0" 0)
set grid y2tics
do for [i=20:ScaleChangeAt:20] {
    set y2tics add (sprintf("%g",i) i)
}
do for [i=ScaleChangeAt:Y2max:20*ScaleChangeFactor] {
    set y2tics add (sprintf("%g",i) i)
}

plot \
    $Data u 1:ColTemp+1:(f3(column(ColPrec+1))) axis x1y1 w filledcurves above lc rgb "yellow" not,\
    '' u 1:ColTemp+1:(f3(column(ColPrec+1))) axis x1y1 w filledcurves below fs pattern 4 fc rgb "blue" not,\
    '' u 1:(f3(ScaleChangeAt)):(f3(column(ColPrec+1))) axis x1y1 w filledcurves below fs solid 1.0 fc rgb "blue" not,\
    '' u 1:ColTemp+1 w l lw 2 lc rgb "red" not,\
    '' u 1:ColPrec+1 axes x1y2 w l lw 2 lc rgb "blue" not
### end of code

这会导致:

enter image description here


0
投票

filledcurves不具有两列和三个选择的Y值不同轴的方法。但你是在幸运的情况下,你有固定的Y范围。所以,你可以定义缩放功能中的一列:

set y2tics textcolor rgb "black" 
set ytics nomirror
set yrange [0:80]
set y2range [0:180]
scale = 80.0/180.0
set key off
set grid dashtype 5 # auch dt ".-." möglich
plot "klima_flach.txt" using 1:3:(scale*$4) with filledcurves,\
     "" using 1:4 with lines axis x1y2,\
     "" using 1:3:xtic(2) with lines axis x1y1
热门问题
推荐问题
最新问题