How to| 为图表和图形添加误差棒
通常,基于测量数据的图形用垂直线条或以各点为中心的区间表示相关联的误差估计. Wolfram 语言允许用户用两种不同方式为图表和图形添加这种误差棒.
以下是计算并绘制2009年各月圣路易斯市平均最高温度的步骤.
以 TimeSeries 形式,使用 WeatherData 导入2009年圣路易斯市每日最高温度:
rawData = WeatherData["Saint Louis", "MaxTemperature", {{2009, 1, 1}, {2009, 12, 31}, "Day"}]使用 TimeSeriesWindow(首先定义月尾)把每个月的数据点分组:
ends = DayRange[{2009, 1, 1}, {2009, 12, 31}, "EndOfMonth"]filteredDataByMonth = Table[TimeSeriesWindow[rawData, {{2009, k, 1}, ends[[k]]}], {k, 1, 12}];meanData = Mean /@ filteredDataByMonth定义一个函数,计算以 TimeSeries 给定的数据集的标准误差. 在这里,标准误差即标准偏差除以数据集观测数的平方根:
standardError[ts_] := StandardDeviation[ts] / Sqrt[ts["PathLength"]]stdErrorData = standardError /@ filteredDataByMonth接下来,定义一个函数,该函数用于将误差棒添加到一个条形图上:
errorBar[type_ : "Rectangle"][{{x0_, x1_}, {y0_, y1_}}, value_, meta_] := Block[{error, mags = QuantityMagnitude[value]},
error = Flatten[QuantityMagnitude[meta]];
error = If[error === {}, 0, Last[error]];{ChartElementData[type][{{x0, x1}, {y0, y1}}, mags, meta], {Black, Line[{{{(x0 + x1) / 2, y1 - error}, {(x0 + x1) / 2, y1 + error}}, {{1 / 4 (3 x0 + x1), y1 + error}, {1 / 4 (x0 + 3 x1), y1 + error}}, {{1 / 4 (3 x0 + x1), y1 - error}, {1 / 4 (x0 + 3 x1), y1 - error}}}]}}]该函数取其数据点为 data->error. 这里,平均值与相关联的标准误差被置于这个形式中:
chartData = Table[meanData[[i]] -> stdErrorData[[i]], {i, 1, Length[meanData]}]labels = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"};使用 BarChart 作出条形图:
BarChart[chartData, ChartElementFunction -> errorBar["Rectangle"], ChartLabels -> Placed[labels, Axis, Rotate[Style[#, 12, FontFamily -> "Arial"], Pi / 2]&], Frame -> Left, FrameLabel -> Automatic]数据及相关误差也可以通过另一种图形表示,图形中各个均值之间用直线连接.
这种绘图需要首先加载 ErrorBar Plotting Package:
Needs["ErrorBarPlots`"]ErrorListPlot 是该程序包的一部分,它将数据以 {data,error} 的形式放在一个列表中. 此处,数据以这种形式放置:
plotData = QuantityMagnitude /@ Partition[Riffle[meanData, stdErrorData], 2]设置刻度标签以用于 ErrorListPlot:
tickSpecs = {{{1, "Jan"}, {2, "Feb"}, {3, "Mar"}, {4, "Apr"}, {5, "May"}, {6, "Jun"}, {7, "Jul"}, {8, "Aug"}, {9, "Sept"}, {10, "Oct"}, {11, "Nov"}, {12, "Dec"}}, Automatic};通过 ErrorListPlot 绘制数据:
ErrorListPlot[plotData, Joined -> True, Frame -> {Left, Bottom}, Ticks -> tickSpecs, AxesLabel -> {None, Style["Temperature (C)", 12, FontFamily -> "Arial"]}]