gpt4 book ai didi

wolfram-mathematica - BarSpacing 选项是如何在 Mathematica 中真正实现的?

转载 作者:行者123 更新时间:2023-12-04 10:29:21 28 4
gpt4 key购买 nike

我正在尝试实现 DateListBarChart获取日期数据并输出与 DateListPlot 具有相同位置的条形图的函数.如果给定相同的数据,它们必须在相同的水平位置绘制数据,因此可以使用 Show 将它们组合起来。 .我发现很难获得 BarSpacing 的设置正确,以便绘图的水平范围不会改变,并且条形基本上保持在相同的位置。

我一直无法推断出正确的缩放比例,以便 BarSpacing->{0.2,0.3}结果是该组钢筋可用的 x 轴长度的 20% 被该组中钢筋之间的间距占用,30% 用作钢筋组之间的间距。出于技术原因,我通过将东西传递给 RectangleChart 来做到这一点。 .根据文档,BarSpacingRectangleChart 中被视为绝对单位.显然,如果有更多系列,间隙的绝对尺寸需要更小,并且条形需要更窄。

一些例子:

arList = FoldList[0.9 #1 + #2 &, 0.01, RandomReal[NormalDistribution[0, 1], 24]]

{0.01, 0.334557, 2.02709, 1.1878, 1.9009, 3.08604, 2.36652, 3.04111,
3.32364, 3.22662, 3.12626, 2.59118, 1.69334, 1.21069, 0.23171,
0.689415, -0.852649, -0.124624, 0.58604, -0.481886, 0.221074,
-0.300329, 2.36137, 0.427789, -1.47747}

dists = RandomChoice[{3, 4}, Length[arList]]
{4, 4, 4, 3, 4, 3, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 3, 4, 3, 3, 3, 3, 3}

结果是:
RectangleChart[Transpose[{dists - 0 - 0/2, arList}], 
PlotRange -> {{0, 100}, {-2, 4}}, ChartStyle -> EdgeForm[None],
Frame -> True, GridLines -> Automatic, BarSpacing -> {0, 0}]

enter image description here
RectangleChart[Transpose[{dists - 0.7 - 0.5/2, arList}], 
PlotRange -> {{0, 100}, {-2, 4}}, ChartStyle -> EdgeForm[None],
Frame -> True, GridLines -> Automatic, BarSpacing -> {0.7, 0.5}]

enter image description here

请注意,数据沿 x 轴的距离与前一个示例不同。

尝试绘制多个系列的图表时会变得更加困惑(在本例中也是如此,以供说明)。
RectangleChart[
Transpose[{{dists - i/2 - j/2, arList}, {dists - i/2 - j/2,
arList}}, {2, 3, 1}], PlotRange -> {{0, 180}, {-2, 4}},
ChartStyle -> EdgeForm[None], Frame -> True, Ticks -> None,
GridLines -> Automatic, BarSpacing -> {i, j}]

enter image description here

多年来,我一直在努力寻找正确的公式,以便 BarSpacing自定义函数的设置(此处未显示)会产生正确的间距和条宽,以便水平绘图范围不会随着 BarSpacing 而改变。做。

我错过了什么?

编辑:为了回应贝利撒留,这是我要去哪里的一个例子。它有效,有点(条形与线不太对齐,但这可能是我使用的日期)但是堆叠条形的情况无法与条形一起绘制在它们应该在的位置,就像任何类型的条形图本身有多个系列。 (我为日期标签放置算法感到非常自豪:工作中的权力不想放弃那种外观。)

enter image description here

这是一个不起作用的。数据应填充水平范围。 (不同的宽度条是故意的 - 它是年度和季度数据的组合。)

enter image description here

编辑 2

我记得我为什么不使用 FillingDateListPlot像 Mike Honeychurch 的包装中那样绘制条形 - 如果您有除非常细的条形之外的任何东西,它们最终会将顶部边缘放在错误的位置。
DateListPlot[{dateARList}, 
PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0},
FillingStyle -> {1 -> {{AbsoluteThickness[12], Darker[Red, 0.25]}}},
PlotRange -> All]

enter image description here

最佳答案

也许使用 ChartElementFunction 选项而不是 BarSpacing 有帮助。例如 barplot在代码中将绘制一个条形图,使得每个条形的边距为 gapl在左侧和 gapr在右边gaplgapr是条形总宽度的分数

scale[{{xmin_, xmax_}, {ymin_, ymax_}}, {gapl_, gapr_}] :=
{{xmin (1 - gapl) + xmax gapl, ymin}, {xmax (1 - gapr) + xmin gapr, ymax}}

barplot[dists_, arList_, {gapl_, gapr_}, opts___] :=
RectangleChart[Transpose[{dists, arList }], opts,
Frame -> True,
GridLines -> Automatic, BarSpacing -> 0,
ChartElementFunction -> (Rectangle @@ scale[#, {gapl, gapr}] &)]

用法:

绘制没有间隙的原始条形图
barplot[dists, arList, {0, 0}]

rectangle chart with no gaps

这将绘制一个两侧边距为 0.2 的条形图,导致条形图的间隙为条形总宽度的 0.4 倍。请注意,条形的位置与第一张图中的位置相匹配。
barplot[dists, arList, {0.2, 0.2}]

barchart with gaps

您可以通过执行类似的操作来绘制多个系列
Show[barplot[dists, arList 0.9, {0, 0.5}],
barplot[dists, arList 0.8, {0.5, 0}, ChartStyle -> LightGreen]]

two series in one plot

关于wolfram-mathematica - BarSpacing 选项是如何在 Mathematica 中真正实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7293317/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com