我想用gnuplot重现这个情节:
我的数据采用以下格式:
数据
1:时间
2:价格
3:音量
我试过了:
plot file using 1:2 with lines, '' using 1:3 axes x1y2 with impulses
其中给出了一个正常的时间序列图表,其中y1
为价格,y2
为量
接下来,我试过了:
plot file using 2:1 with lines, '' using 2:3 axes x1y2 with impulses
其中,价格系列的时间为y1
,时间为y2
。
但是,我需要将价格保持在y1
并将价格保持在x2
。
可能是这样的:
plot file using 1:2 with lines,' ' using 2:3 axes y1x2 with impulses
然而,这并没有给出我想要的东西。
答案 0 :(得分:3)
Gnuplot
没有官方的方式来绘制这种水平箱图。但是,您可以使用boxxyerrorbars
(简写boxxy
)来实现此目的。
由于我没有您的实际示例的任何测试数据,我从高斯随机漫步生成了一个数据文件。要生成数据,请运行以下python
脚本:
from numpy import zeros, savetxt, random
N = 500
g = zeros(N)
for i in range(1, N):
g[i] = g[i-1] + random.normal()
savetxt('randomwalk.dat', g, delimiter='\t', fmt='%.3f')
接下来,我会对“位置数据”(在您的情况下是卷数据)进行分级。为此,可以使用smooth frequency
。这会计算相同y
- 值的x
值的总和。所以首先我使用一个合适的binning函数,它返回一定范围内的相同值(x
+ - binwidth/2
)。输出数据保存在文件中,因为对于绘图,我们必须交换x
和y
值:
binwidth = 2
hist(x) = floor(x+0.5)/binwidth
set output "| head -n -2 > randomwalk.hist"
set table
plot 'randomwalk.dat' using (hist($1)):(1) smooth frequency
unset table
unset output
通常一个人应该能够使用set table "randomwalk.hist"
,但由于存在错误,需要使用此解决方法来过滤掉表输出的最后一个条目,请参阅我对Why does the 'set table' option in Gnuplot re-write the first entry in the last line?的回答。
现在实际的绘图部分是:
unset key
set x2tics
set xtics nomirror
set xlabel 'time step'
set ylabel 'position value'
set x2label 'frequency'
set style fill solid 1.0 border lt -1
set terminal pngcairo
set output 'randwomwalk.png'
plot 'randomwalk.hist' using ($2/2.0):($1*binwidth):($2/2.0):(binwidth/2.0) with boxxy lc rgb '#00cc00' axes x2y1,\
'randomwalk.dat' with lines lc rgb 'black'
给出结果(4.6.3,当然取决于您的随机数据):
因此,对于您的数据结构,以下脚本应该有效:
reset
binwidth = 2
hist(x) = floor(x+0.5)/binwidth
file = 'data.txt'
histfile = 'pricevolume.hist'
set table histfile
plot file using (hist($2)):($3) smooth unique
unset table
# get the number of records to skip the last one
stats histfile using 1 nooutput
unset key
set x2tics
set xtics nomirror
set xlabel 'time'
set ylabel 'price'
set x2label 'volume'
set style fill solid 1.0 border lt -1
plot histfile using ($2/2.0):($1*binwidth):($2/2.0):(binwidth/2.0) every ::::(STATS_records-2) with boxxy lc rgb '#00cc00' axes x2y1,\
file with lines using 1:2 lc rgb 'black'
注意,这次跳过最后一个table
条目是通过使用stats
命令对所有条目进行计数,并使用every
跳过最后一个条目来完成的(是的,{{ 1}}是正确的,因为点编号从STATS_records-2
开始。此变体不需要任何外部工具。
我还使用0
来计算平均值,而不是总和(用smooth unique
完成)。