#wolfram-mathematica
#wolfram-mathematica
Вопрос:
У меня есть набор данных, который содержит ошибки как x, так и y. В общем случае ошибки y составляют порядка 2-10% от значения y. Однако ошибки x сильно варьируются от 0,01% до 5% от значений x.
В настоящее время я использую следующее для построения своих данных:
ErrorListPlot[ errorPlotData[#],
ImageSize -> 800,
PlotRange -> All,
ErrorBarFunction -> err]
Где err
определяется как:
err[coords_, errs_] := {
Opacity[0.2],
Rectangle[
coords {errs[[1, 1]], errs[[2, 1]]},
coords {errs[[1, 2]], errs[[2, 2]]}
]
}
Это взято из примера в документации по функции ErrorBarFunction. Однако из-за некоторых небольших ошибок в направлении x на графике вообще не отображается прямоугольник: т. Е. Ширина прямоугольника слишком мала, чтобы отобразить даже пиксель, и поэтому ошибки x или y не отображаются.
Мне нужно написать функцию, которая имеет минимальную ширину поля ошибки.
Я попытался сделать что-то простое, например:
err[coords_, errs_] := Module[{x0, x1, y0, y1},
x0 = errs[[1, 1]];
x1 = errs[[1, 2]];
If[(x1 - x0) < 10^-6, x0 = 10^-6; x1 = -10^-6];
{Opacity[0.2],
Rectangle[coords {x0, errs[[2, 1]]},
coords {x1, errs[[2, 2]]}]}
];
И это почти работает. Однако, поскольку диапазон по оси x может составлять от /-5e-3 до /- 10e-3, решение работает только для графиков меньшего диапазона и больших настроек ImageSize.
Итак, я думаю, мне нужно использовать какой-нибудь «масштабированный» способ получения координат, но я не могу заставить что-либо работать, используя это.
У кого-нибудь есть какие-либо предложения?
Томек
Редактировать: пример данных:
In[1069]:= errorPlotData["70"][[1 ;; 20, All]]
Out[1069]= {{{0.0006131, 7314.3},
ErrorBar[1.9084*10^-7, 309.11]}, {{0.00060638, 7339.9},
ErrorBar[2.3891*10^-7, 310.03]}, {{0.00060042, 7401.7},
ErrorBar[4.9478*10^-8, 331.15]}, {{0.00059433, 7340.3},
ErrorBar[6.3614*10^-8, 348.5]}, {{0.00058777, 7351.5},
ErrorBar[1.9791*10^-8, 323.53]}, {{0.00058167, 7349.3},
ErrorBar[6.9976*10^-8, 335.46]}, {{0.00057494, 7405.8},
ErrorBar[3.6967*10^-7, 319.49]}, {{0.00056835, 7341.},
ErrorBar[3.4705*10^-7, 364.98]}, {{0.00056223, 7392.4},
ErrorBar[1.7317*10^-7, 336.12]}, {{0.00055588, 7398.},
ErrorBar[1.2794*10^-7, 353.29]}, {{0.00054985, 7344.3},
ErrorBar[3.5341*10^-8, 350.58]}, {{0.0005436, 7363.3},
ErrorBar[6.8562*10^-8, 371.04]}, {{0.00053714, 7426.6},
ErrorBar[3.0959*10^-7, 353.86]}, {{0.00053092, 7409.1},
ErrorBar[4.1915*10^-7, 366.35]}, {{0.00052528, 7385.},
ErrorBar[1.3006*10^-7, 361.69]}, {{0.00051836, 7464.1},
ErrorBar[1.2016*10^-7, 354.99]}, {{0.0005129, 7454.5},
ErrorBar[8.2698*10^-8, 336.79]}, {{0.00050656, 7404.3},
ErrorBar[2.0569*10^-7, 345.19]}, {{0.00050042, 7432.7},
ErrorBar[7.0682*10^-9, 327.78]}, {{0.00049395, 7475.4},
ErrorBar[1.138*10^-7, 343.1]}}
Комментарии:
1. Что здесь такое errorPlotData[#]? У вас есть небольшой образец набора данных, с которым я мог бы протестировать?
2. @ArnoudBuzing, хороший улов, не заметил этого, пока редактировал.
3. @ArnoudBuzing сожалею об этом. Будет ли этого достаточно для вас? (Всего у меня 201 балл.
Ответ №1:
Попробуйте добавить форму края к прямоугольнику. Я думаю, что это может решить проблему с тем, что прямоугольник вообще не отображается:
err[coords_, errs_] := Module[{x0, x1, y0, y1},
x0 = errs[[1, 1]];
x1 = errs[[1, 2]];
{Pink, EdgeForm[{Pink}], Rectangle[coords {x0, errs[[2, 1]]},
coords {x1, errs[[2, 2]]}], Blue, Point[coords]}];
Комментарии:
1. Идеально! Я не знал об этой функции и не нашел ее, просматривая справку! Спасибо