问题标签 [ggproto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - 扩展 ggplot 以获取列表并使它们可用于自定义几何
我正在尝试使 ggplot2 获取列表并使列表中的元素可用于其他自定义几何函数。
我有一个接受列表的新 ggplot 函数:
我创建了我的列表,并绘制了第一个 data.frame:
理想情况下,我想创建这样的东西(这不起作用),另一个默认情况下data_ext
从 ggplot 对象中获取的 geom
我看到我的第二个 data.frame 在 ggplot 对象内,但我不知道如何访问它;也就是说,ggplot(l)$data_ext
有效。我试过玩 ggproto,但我不够熟练,无法理解如何处理它,以及它是否有帮助。
添加 顺便说一句,我可以用管道实现我想要的,但我不想混淆我的功能的潜在用户:
r - 将额外参数传递给 ggplot2 中的自定义几何图形
我正在创建一个自定义几何图形,并希望它采用一个额外的参数,称为showpoints
,它对实际绘图执行某些操作。例如,通过将其设置为 FALSE,geom 实际上会返回一个zeroGrob()
. 我找到了一种方法,但是(i)它笨重而且有些奇怪,并且(ii)我不完全理解我在做什么,这是一个不好的迹象。问题是,当你定义一个新的统计数据时,可以运行setup_params
,但 geoms 没有它:
与 Stat 和 Position 相比,Geom 有点不同,因为设置和计算函数的执行是分开的。setup_data 在位置调整之前运行,而 draw_layer 直到渲染时间才运行,很晚。这意味着没有 setup_params 因为很难传达更改。
基本上,我的代码可以使用附加参数来抑制点的绘制:
到目前为止,这是我的代码,基于扩展 ggplot2 教程:
有没有更简单的方法将选择的额外参数传递给geom?如果我可以定义extra_params
,为什么我不能以某种方式更轻松地访问它们?
r - 刻面时未显示ggplot2自定义统计信息
我正在尝试为 编写一个自定义stat_*
,ggplot2
我想在其中使用瓷砖为 2D 黄土表面着色。当我从扩展指南开始时,我可以像他们一样编写一个 stat_chull :
这适用于简单的调用和方面包装:
当我编写 mystat_loess2d
时,我还可以可视化所有类或单个类:
但是,当我尝试解决上述问题时,不再显示图块:
有人可以告诉我我在这里做错了什么吗?
r - 创建多列分面函数
我正在尝试创建一个facet_multi_col()
函数,类似于facet_col()
in 中的函数ggforce
- 允许带有空格参数的构面布局(在 中不可用facet_wrap()
) - 但在多个列上。grid.arrange()
正如在下面的最后一个图中(y
用
ggproto
阅读扩展指南后,我发现自己已经超出了我的深度。我认为最好的方法是传递一个布局矩阵来指示在哪里为相应的数据子集断开列,并facet_col
在 ggforce 中构建以包含空间参数 - 请参阅问题的结尾。
我不满意的选择的简要说明
无刻面
facet_wrap()
facet_wrap()
没有空间参数,这意味着每个大陆的瓷砖尺寸不同,使用coord_equal()
会引发错误
ggforce 中的 facet_col()
就像侧面的条带一样。space
参数将所有图块设置为相同大小。仍然太长,无法放入页面。
gridExtra 中的 grid.arrange()
为每个大陆应放置的位置的数据添加一列
用于facet_col()
每列的绘图
get_legend()
使用in创建图例cowplot
根据每列中的国家/地区数量创建具有高度的布局矩阵。
带来g
并leg
一起grid.arrange()
使用gridExtra
这几乎是我所追求的,但我不满意,因为 a)不同列中的图块具有不同的宽度,因为最长的国家和大陆名称的长度不相等,并且 b)它的很多代码都需要调整有时间我想制作这样的图 - 使用其他数据我想按地区排列方面,例如“西欧”而不是大陆或国家数量的变化 -gapminder
数据中没有中亚国家。
创建 facet_multi_cols() 函数的进展
我想将布局矩阵传递给构面函数,其中矩阵将引用每个构面,然后该函数可以根据每个面板中的空格数计算出高度。对于上面的示例,矩阵将是:
如上所述,我一直在改编代码facet_col()
以尝试构建一个facet_multi_col()
函数。我添加了一个layout
参数来提供my_layout
上述矩阵,例如,赋予facets
参数的变量的第四和第五级绘制在第三列中。
我想我需要为这compute_layout
部分写一些东西,但我正在努力弄清楚如何做到这一点。
r - 在自定义统计中逃脱“离散美学暗示组”
我正在尝试使用 ggplot2 构建一个自定义统计函数,其中我想访问一个离散变量来计算每个组的统计数据。但是,ggplot 层的默认行为是自动将隐式组分配给任何离散变量(大多数情况下)。这意味着我的数据会被自动分组,这是我不希望的。
我可以显示如下;我有一个非常标准的构造函数:
我有一个 Stat ggproto 对象,它只是传递数据,但出于说明目的打印数据的头部。我在这里调用了我感兴趣的用于计算实际统计数据的位value
。
现在,如果我用这个统计数据构建一个图,我们可以看到compute_group()
函数中的内容为data
.
由reprex 包(v0.3.0)于 2020 年 5 月 28 日创建
我想要 1 个 data.frame 包含此案例的所有数据。我们在上面看到我们打印了 3 个带有不同group
变量的 data.frames,这意味着数据被分成了 3 组。我认为到达那里需要的是让value
变量逃脱自动组检测。
我考虑了以下几点:
- 我可以让组默认为
-1
,这是标准的“无组”组。但是,当我这样做时,数据不会自动分组,例如aes(colour = some_variable)
. 这是我绝对想要发生的。 - 查看
ggplot2:::add_group()
函数,似乎我可以通过命名我的value
变量来逃避自动分组label
,但是这会使 stat 不兼容geom_text()
并且它不能value
自然地描述的含义。 - 我可以用
layer()
这个函数的一个变体替换调用,这将创建一个不同的 Layer ggproto 对象,其中compute_aesthetics()
不同的组工作。然而,这是我宁愿避免负担的大量工作。 - 我可能会按照 . 的方式来做一个技巧,但是在那个类中包装我的变量
vctrs::new_vctr(..., class = "not_discrete")
的合适位置在哪里?value
欢迎提供有用的建议,或者对“仅使用label
”参数进行新的处理。
r - 使用自定义 geom 分组失败 - 如何从 draw_panel() 检查内部对象
这是与从此答案修改的自定义几何相关的问题。给定的 geom 分组失败,所以我包含coord_munch
在 中draw_panel
,深受GeomLine
和的启发GeomPath
。它实际上在很多情况下都有效,但我觉得它经常同样失败。
特别是,它似乎在两人一组时失败(见下面的例子),并且在使用拼凑而成的某些地块上奇怪地失败了。我打开了一个issue,但还没有得到回复,对此我并不感到惊讶,我同意并认为这实际上是一个写得不好的geom的问题,而不是拼凑的问题。
我相信用于 GeomPath 的分组(在代码## Work out grouping variables for grobs
中用 标记)对于这个 grob 失败,但我不知道如何检查在两者之间创建的 munch 对象。
我的主要问题是,我如何检查这个对象?
如果有人看到并理解我的 geom 问题,我会更加感激。干杯
例子:
与 geom_path 一起使用
geom_trail 失败
使用颜色时更糟
由reprex 包(v0.3.0)于 2020-07-02 创建
几何轨迹
数据
r - 在 ggplot2 几何图形中使用 setup_params()
我正在为ggplot2制作自己的geom,我注意到在ggplot2的文档中,它明确表示没有setup_params()
geoms:
与
Stat
and相比Position
,Geom
有点不同,因为 setup 和 compute 函数的执行是分开的。setup_data
在位置调整之前draw_layer()
运行,直到渲染时间才运行,很晚。这意味着没有setup_params
,因为很难传达更改。
但是,当我制作一个 ggproto Geom 时setup_params = function(data, params) {...}
,它会很好地调用该函数,并且它似乎可以工作。
是什么赋予了?我可以使用此功能修改参数吗?
r - ggplot2::coord_cartesian 在方面
coord_cartesian
不允许设置每个方面的坐标,并且使用其他范围限制往往会在特定极端上产生一条直线。由于我们有广泛变化的 y 范围,我们不能对所有方面都设置相同的限制;geom_line
在 plot 之前限制数据对/ geom_path
( https://stackoverflow.com/a/27319786/3358272 )不友好,因为插入数据以到达边缘然后插入NA
s 以打破上线。(最终,获得所需结果的唯一方法就是这样做,这对于其他数据可能有点繁琐。)
https://gist.github.com/burchill/d780d3e8663ad15bcbda7869394a348a中建议了一种解决方法,它以
在以前的版本中ggplot2
,该要点定义coord_panel_ranges
并能够控制每个方面的坐标。右侧的两个方面应缩小到 1-6(ish)的 y 轴,以便爆炸置信区间脱离屏幕并允许方面主要关注数据的“正常范围”。(注意:test_data
这个 vis 不是我的,它取自要点。虽然我的需求有些相似,但我认为最好留在要点的数据和代码的范围内。)
不幸的是,这对我来说现在失败了ggplot2-3.3.0
。与最近丢失的 相关的初始错误ggplot2::scale_range
,我试图通过对 burchill 代码(使用其他ggplot2:::
内部函数)的这种改编来减轻这些错误:
但这仍然失败
我对扩展不是很熟悉ggplot2
,我怀疑 ggproto 中缺少一些东西。以下是 proto 的返回值:
我是否需要一个x
至少包含一个break_positions_minor
函数的列表元素,或者是否需要继承其他东西以确保panel_params$x$break_positions_minor
存在或使用合理的默认值?
数据: