gnuplot:如何为每个月的温度绘制颜色方块?
gnuplot: how to plot color squares for each month's temperature?
我想使用 gnuplot 绘制下图(来自 Fundamentals of Data Visualization):
我希望每个位置的数据类似于:
# month temperature
01 60.0
02 78.0
03 90.0
...
12 78.0
这是我试过的。为简单起见,我已将数据转置为矩阵。
$data << EOD
1.50 1.57 1.85 2.15 1.87 1.05 1.70 1.65 1.97 1.71 1.53 1.15
4.44 4.71 4.74 3.50 3.43 4.98 4.29 4.55 3.93 3.34 3.74 4.88
8.55 9.59 5.65 0.13 9.33 4.70 8.94 7.74 4.49 6.26 0.96 1.20
EOD
unset border
unset ytics
set xlabel 'month'
set palette rgbformula -7,2,-7
set cbrange [0:10]
set cblabel "precipitation"
set xrange [-0.5:11.5]
set yrange [-0.5:2.5]
set xtics ("Jan" 0, "Feb" 1, "Mar" 2, "Apr" 3, "May" 4, \
"Jun" 5, "Jul" 6, "Aug" 7, "Sep" 8, "Oct" 9, "Nov" 10, "Dec" 11)
plot $data matrix with image
但效果却差强人意。例如,如何在正方形之间生成清晰的边界?
绘图样式with image
可能不能有边框。所以,我会使用通用风格 with boxxyerror
。
此外,我会添加一行 header 并循环遍历列(因为总会有 12 个月),而不是矩阵格式
检查以下示例以及 help boxxyerror
、help size
、help xticlabels
和 help strftime
以进一步阅读。
如果您的数据位于单独的文件中,则必须相应地修改脚本。
脚本:
### plotting style boxxyerror as replacement for "with image"
reset session
$Data << EOD
# location Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Atlantis 1.50 1.57 1.85 2.15 1.87 1.05 1.70 1.65 1.97 1.71 1.53 1.15
Mordor 4.44 4.71 4.74 3.50 3.43 4.98 4.29 4.55 3.93 3.34 3.74 4.88
Wonderland 8.55 9.59 5.65 0.13 9.33 4.70 8.94 7.74 4.49 6.26 0.96 1.20
EOD
unset border
set xlabel 'month'
set xrange [0.5:12.5]
set yrange [:] reverse
set ytics
set palette rgbformula -7,2,-7
set cbrange [0:10]
set cblabel "precipitation"
MonthName(n) = strftime("%b",24*3600*28*n) # get the month name from 1..12
set key noautotitle
set style fill solid 1.0 border rgb "white"
set size ratio -1 # make the boxes squares
plot for [i=1:12] $Data u (i):0:(0.5):(0.5):i+1: \
xtic(MonthName(i)):ytic(1) w boxxy fc palette lw 2
### end of code
结果:
我想使用 gnuplot 绘制下图(来自 Fundamentals of Data Visualization):
我希望每个位置的数据类似于:
# month temperature
01 60.0
02 78.0
03 90.0
...
12 78.0
这是我试过的。为简单起见,我已将数据转置为矩阵。
$data << EOD
1.50 1.57 1.85 2.15 1.87 1.05 1.70 1.65 1.97 1.71 1.53 1.15
4.44 4.71 4.74 3.50 3.43 4.98 4.29 4.55 3.93 3.34 3.74 4.88
8.55 9.59 5.65 0.13 9.33 4.70 8.94 7.74 4.49 6.26 0.96 1.20
EOD
unset border
unset ytics
set xlabel 'month'
set palette rgbformula -7,2,-7
set cbrange [0:10]
set cblabel "precipitation"
set xrange [-0.5:11.5]
set yrange [-0.5:2.5]
set xtics ("Jan" 0, "Feb" 1, "Mar" 2, "Apr" 3, "May" 4, \
"Jun" 5, "Jul" 6, "Aug" 7, "Sep" 8, "Oct" 9, "Nov" 10, "Dec" 11)
plot $data matrix with image
但效果却差强人意。例如,如何在正方形之间生成清晰的边界?
绘图样式with image
可能不能有边框。所以,我会使用通用风格 with boxxyerror
。
此外,我会添加一行 header 并循环遍历列(因为总会有 12 个月),而不是矩阵格式
检查以下示例以及 help boxxyerror
、help size
、help xticlabels
和 help strftime
以进一步阅读。
如果您的数据位于单独的文件中,则必须相应地修改脚本。
脚本:
### plotting style boxxyerror as replacement for "with image"
reset session
$Data << EOD
# location Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Atlantis 1.50 1.57 1.85 2.15 1.87 1.05 1.70 1.65 1.97 1.71 1.53 1.15
Mordor 4.44 4.71 4.74 3.50 3.43 4.98 4.29 4.55 3.93 3.34 3.74 4.88
Wonderland 8.55 9.59 5.65 0.13 9.33 4.70 8.94 7.74 4.49 6.26 0.96 1.20
EOD
unset border
set xlabel 'month'
set xrange [0.5:12.5]
set yrange [:] reverse
set ytics
set palette rgbformula -7,2,-7
set cbrange [0:10]
set cblabel "precipitation"
MonthName(n) = strftime("%b",24*3600*28*n) # get the month name from 1..12
set key noautotitle
set style fill solid 1.0 border rgb "white"
set size ratio -1 # make the boxes squares
plot for [i=1:12] $Data u (i):0:(0.5):(0.5):i+1: \
xtic(MonthName(i)):ytic(1) w boxxy fc palette lw 2
### end of code
结果: