前言
正好需要给一个时间序列的柱状图添加误差棒,但官网上看到的图都是加了误差阴影,于是求助了好几位同学和师姐才明白怎么画误差棒,原来图形都要一个一个添加而不是直接会有个函数来加好。
现在总结如下:
一、误差棒
代码如下(示例):
;首先需要画好一个柱状图或折线图plot
;************************************************
; add error bars
;************************************************
polyres = True ; marker resources
polyres@gsMarkerIndex = 1.0 ; index for circle
polyres@gsMarkerSizeF = 0.03 ; size
polyres@gsMarkerThicknessF= 2.0 ;3.0
polyres@gsMarkerColor = "blue"
polyres@gsLineDashPattern = 0
polyres@gsLineColor = "blue"
polyres@gsLineThicknessF = 2.0 ;3.0
polyres@PreDraw = True
error_bar = new(dimsizes(gmst_esmean),graphic)
centers = new(dimsizes(gmst_esmean),graphic)
;--------- Manually create and attach legend---------
res_lines = True ; polyline mods desired
res_lines@gsLineDashPattern = 0. ; solid line
res_lines@gsLineThicknessF = 2. ; line thicker
res_lines@gsLineColor = "blue" ; line color
; loop through the points
dum = new(78, graphic) ;这里设定横轴共有39个点,因为每个点的误差棒上面需要一个小横线下面也需要一个,所以共创建横轴点数2倍的dum
do t = 0, 38 ;按照横轴点数来循环
; add a polymarker as the center of the error bar located at each data point
; 先画中心的圆点和竖着的线
centers(t) = gsn_add_polymarker(wks,plot,t+1982,gmst_esmean(t),polyres)
error_bar(t) = gsn_add_polyline(wks,plot,(/t+1982,t+1982/),(/gmst_esmean(t)+error(t),gmst_esmean(t)-error(t)/),polyres)
xx = (/1981.85+t,1982.15+t/)
;再画上面的小横线
yy = (/gmst_esmean(t)+error(t), gmst_esmean(t)+error(t)/)
dum(t) = gsn_add_polyline(wks,plot,xx,yy,res_lines) ; add polyline
delete(yy)
;最后画下面的小横线
yy = (/gmst_esmean(t)-error(t), gmst_esmean(t)-error(t)/)
dum(t+39) = gsn_add_polyline(wks,plot,xx,yy,res_lines) ; add polyline
delete(xx)
delete(yy)
end do
二、误差阴影
其实这里就是官网给出的,思路是找到多边形的横坐标和竖坐标,然后填个色就行
代码如下(示例):
error = dim_stddev_n_Wrap(timeseries, 0);/sqrt(39)
timeseries := dim_avg_n_Wrap(timeseries, 0)
trend = trend_manken(timeseries, True, 0)
error_up = timeseries + error
error_down = timeseries - error
;*******************************************
; define a polygon centered with +/- error
;*******************************************
polygon_x = new((/78/), float)
polygon_x(0:38) = year
polygon_x(39:77) = year(::-1)
polygon_y = new((/78/), float)
polygon_y(0:38) = error_down(:)
polygon_y(39:77) = error_up(::-1)
;************************************************
; add error bars
;************************************************
gsres = True ; poly res
gsres@tfPolyDrawOrder = "Predraw" ; draw this first
gsres@gsFillColor = "gray" ; color chosen
dummy = gsn_add_polygon (wks1, plot, polygon_x, polygon_y, gsres)
希望可以帮助到大家~
我也是个代码小白,起步阶段都是靠搜索和在出错中不断实践进行学习的,希望遇到困难的你不要灰心,总会有解决办法哒!