我使用 LaTex 中的旋转包将图表旋转 270° 来制作水平直方图。 调整所有标签和抽动是没有问题的,但是我没有找到旋转密钥的方法。
这是我的 gnuplot 代码:
set terminal epslatex size 16cm, 32cm
set output "stackexchange.tex"
set xrange [-1:8]
set key
set boxwidth 0.95
set style data histograms
set style histogram errorbars
set style fill solid 0.8
set style line 1 lt 1 lc rgb "#0080B0" lw 3
set yrange[600:1100]
unset ytics
set y2tics rotate
set y2label rotate "xyz / abc"
set xtics nomirror rotate scale 0
plot 'stackexchange.dat' using 2:3:xticlabels(1) ls 1 title 'A', '' using 4:5 ls 1 fill pattern 6 title 'B'
这就是我在 LaTex 中实现它的方式:
\begin{figure}
\begin{turn}{270}
\resizebox{!}{0.9\textwidth}{\input{stackexchange}}
\end{turn}
\end{figure}
这是我的数据文件:
A 890.1 3.2 789.9 11.7
B 626.97 20.467 862.8 12.3
C 923.9 5.89 963.8 3.7
D 785.233 15.921 627 2.3
E 903.167 7.94 880.9 1.9
F 863.43 25.237 778.2 4.2
G 909.6 5.370 941 13
H 895.633 40.401 813 11.3
我想这是一个经典的xy问题。 实际上,您想要一个水平条形图,并且由于它在 gnuplot 中不作为直接绘图样式存在,您认为解决方案是制作一个垂直条形图并旋转它,现在您遇到了如何旋转条形图的问题关键标签。
我知道如果有水平条形图会很方便,但据我所知 gnuplot 5.4 仍然没有它。 实际上,它并不是真正需要的,因为您可以使用绘图样式
boxxyerror
(至少从 gnuplot 4.0 开始可用)“手动”完成它。以下脚本适用于 gnuplot>=5.0 (OP 提出问题时的版本),并且即使对于旧版本也进行了一些小的修改。下面的结果来自 wxt
终端,但与 epslatex
终端的工作原理应该相同。
剧本相当笼统。因此,我在 OP 的数据中添加了两列,只需设置
N=3
,您就可以在图表中获得其他数据(参见第二张图片)。
脚本:(适用于 gnuplot>=5.0.0,2015 年 1 月)
### Horizontal grouped bar chart
reset session
$Data <<EOD
A 890.1 3.2 789.9 11.7 627 2.3
B 626.97 20.467 862.8 12.3 778.2 4.2
C 923.9 5.89 963.8 3.7 789.9 11.7
D 785.233 15.921 627 2.3 813 11.3
E 903.16 7.94 880.9 1.9 862.8 12.3
F 863. 25.237 778.2 4.2 880.9 1.9
G 909.6 5.37 941 13.0 941 13.0
H 895.6 40.41 813 11.3 963.8 3.7
EOD
N = 2 # number of boxes in group
gap = 0.2 # relative gap between groups
width = 0.8 # relative boxwidth in group
grid = (1.0 - gap)/N # raster
y(i) = column(0) + (i-N/2.-0.5)*grid # y-position
dy = grid*width/2. # half relative boxwidth
title(i) = sprintf("column %d",2*i) # key/legend entry
set style fill transparent solid 0.5
set offset 0,0,0.5,0.5
set xrange [600:1100]
set yrange [:] reverse
set ytics out
set key noautotitle
plot for[i=1:N] $Data u (0):0:(0):i*2:(y(i)-dy):(y(i)+dy):ytic(1) w boxxy lc i ti title(i), \
for[i=1:N] '' u i*2:(y(i)):i*2+1 w xerr lc i
### end of script
结果:
N = 2
N = 3
我想你可以做这样的事情:
x = 0.5
y = 1000
dx = 0.1
dy = 50
set label 'B' at x,y rotate by 90 offset 0.5,-1
set style rectangle fc ls 3 fs pattern 6 border 3
set object rectangle from x,y to x+dx,y+dy
我让您设置
style rectangle
的属性,使其与您的直方图匹配。