问题标签 [gtable]

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.

0 投票
1 回答
7840 浏览

r - 如何在双 y 轴 ggplot 上显示图例

我正在尝试使用 ggplot 组成一个双 y 轴图表。首先让我说,我不是在寻找关于这样做是否是好的做法的优点的讨论。我发现它们在查看基于时间的数据以识别 2 个离散变量的趋势时特别有用。在我看来,对此的进一步讨论更适合交叉验证。

Kohske提供了一个很好的例子来说明如何做到这一点,到目前为止我已经使用它,效果很好。然而,我在我的极限中包含两个 y 轴的图例。我在这里这里也看到了类似的问题,但似乎没有一个解决包含图例的问题。

我有一个使用 ggplot 中的 diamonds 数据集的可复制示例。

数据

图表

问题:有没有人有一些关于如何让图例的第二部分显示的提示?

以下是按 p1、p2、组合 p1&p2 的顺序生成的图表,您会注意到 p2 的图例没有显示在组合图表中。

p1

p1

p2

p2

结合 p1 和 p2

结合 p1 和 p2

0 投票
2 回答
13500 浏览

r - 如何使用带有双 y 轴 ggplot 的构面

我一直在尝试从这里扩展我的场景以利用方面(特别是facet_grid())。

我已经看过这个例子,但是我似乎无法让它为我的geom_bar()geom_point()组合工作。我试图使用示例中的代码,只是从 更改facet_wrap为 似乎facet_grid也使第一层不显示。

在网格和 grobs 方面,我是一个新手,所以如果有人可以就如何让 P1 显示在左 y 轴上而 P2 显示在右 y 轴上提供一些指导,那就太好了。

数据

p1 & p2

尝试组合(基于上面链接的示例) 这在第一个 for 循环中失败,我怀疑 geom_point.points 的硬编码,但是我不知道如何使它适合我的图表(或足够流畅以适合各种图表)

编辑以尝试使其可行facet_wrap

以下代码仍然适用于facet_gridusingggplot2 2.0.0

0 投票
1 回答
2666 浏览

r - 在 facet_grid ggplot 上强制 x 轴标签:x 轴标签每行不同

我很高兴在帖子为 facet_grid 图的所有方面强制启用 X 轴文本中找到解决我问题的大部分内容。

我想创建一个看起来有点像 OP Drew Steen 的图表,除了我有超过两行的刻面,我想让每行的 x 轴标签不同。

我根据@baptiste 的精彩回答做了一个超级hacky 的解决方案(主要是因为我不熟悉 gtable 包),我想知道:

  1. 如果有比我在下面写的混乱更优雅的解决方案
  2. 如何为“Premium”(中间)行插入标签。

这是我改编自@Drew Steen 和@baptiste 的代码,

见图表

0 投票
1 回答
1797 浏览

r - 用 grid 和 gtable 拆解 ggplot

ggplot我正在努力构建基于对象的双轴图。在巴蒂斯特的建议下,我将问题分解为更小的部分。目前的问题是:

  1. 如何从 中删除所有数据grobs,同时保留轴、轴标签、轴刻度线和网格线?“数据”是指与geom_line()和相关联的数据geom_points()

想要这样做的原因是,在构建双轴绘图的过程中,我遇到了以下问题:一个 grob 的网格线会覆盖另一个 grob 的数据。通过删除数据线和点,不会有覆盖。

让我明确一点:我确实有解决方法,包括向 aes() 添加线型并设置 scale_linetype_manual(values = c("solid", "blank") 或者,将数据“脱离网格”发送,但是我想对一个没有被“修饰”太多以达到手头目的的绘图对象进行后期处理。

下面是一些代码和数字。

在下面的情节中,我希望线条消失!

在此处输入图像描述

编辑:按照 baptiste 的建议,我尝试删除数据层。然而,正如 BondedDust 在评论部分指出的那样,这破坏了 ggplot 对象:

从 ggplot 对象中删除数据会破坏它。我在应用程序中使用的一种解决方法是“将数据发送到网格之外”,例如将每个单元格乘以 -999999 并用 切断显示+ scale_y_continuous(limits = c(1, 10)),但如果可行的话,我想避免这种丑陋的黑客攻击。我希望如果我用 NA 或 NULL 替换每个数据点,关联的 gtable 不会被破坏,所以这就是为什么我正在寻找一种从 g 对象内部而不是 p 对象中删除数据的方法。

在操纵 grobs 之后(而不是直接破解 ggplot 对象),结果grid.draw(g)将是:

在此处输入图像描述

仅供参考,第二个情节是通过以下解决方法获得的。

0 投票
1 回答
1446 浏览

r - 替换 gtable 中 ggplot 的元素:标签和网格线

我正在学习ggplot使用gtable. [这是我问的一个相关问题:用 grid 和 gtable 拆除 ggplot ]

目前的问题是:

  1. 如何从一个 gtable 中获取各种轴元素并将它们放入另一个 gtable 以替换现有元素?特别是:替换垂直网格线(和相应的刻度线)。

下面是一些代码和数字。

这是p1:

在此处输入图像描述

这是p2:

在此处输入图像描述

这是 p1 和一些 p2 元素:

在此处输入图像描述

g1 是绿色的,g2 是红色的,我想要红色的底轴标签和垂直网格线来代替绿色的。

我已成功识别轴标签和轴标题,但我仍在寻找垂直网格线(以及轴刻度线和轴水平线!)。我想它们在里面panel,但是如何访问它们并改变它们呢?

在之前的评论中,巴蒂斯特建议names(ggplotGrob(p2)[["grobs"]][[4]][["children"]])作为一种识别不同元素的方法。这将返回:

但是,我不知道如何从这里拿走它。此外,附加的数字,例如 .843 每次会话都会改变,所以我想找到一种方法来不对这些数字进行硬编码。感谢您的建议!

0 投票
1 回答
819 浏览

r - 在 ggplot 中对齐和排列图表

我在 ggplot 中有两个图,在我想对齐的轴上具有相似的范围。

使用:

在哪里size='last'确保网格与 x 对齐,我得到这样的布局:

在此处输入图像描述

对于我要描绘的简单行,顶部图表的垂直范围过大。

我想要一个更符合以下内容的图像:

在此处输入图像描述

或者,g1 图表在 g2 图表的轴下方对齐。(一般来说,假设我希望能够选择其中一个,或者甚至将 g1 覆盖在 g2 之上。

(我的原始模型是一个单独的图表,其中 g1 组件简单地设置为 g2 图表中 y=0 的层;但是,图表太杂乱,无法使用该布局阅读,所以我想我应该移动原始的 y=0元素到一个单独的面板(即g1)。

最小的例子:

我希望标签条(g2)相对于散点图整齐定位。g2 条带是原始图表的一部分,作为 at 的一个geom_text()元素,y=0但图表在此处过于杂乱,标签也放在那里。

0 投票
0 回答
392 浏览

r - ggplot2,geom_bar,在多个绘图中对齐条形大小

我有一组条形图,我试图将它们放入一个图中。它们在多个图中有不同数量的条形图,我看不到将它们与facet_grid. 相反,我使用gtable了布局,但这使事情变得复杂。我无法弄清楚如何正确对齐 x 轴上的刻度以及强制相同宽度的条形。

我在这里使用了来自 babtiste 的绝妙技巧来对齐 y 轴的宽度。地块的位置是通过反复试验确定的。如果方面内的图是平衡的,这里建议的答案似乎才有效。仅使用scale_x_discrete(expand = c(0,0))似乎会影响左上角的情节并使问题变得更糟。

下面是重现问题的代码。请注意条形宽度的差异以及第 1 列中的行之间“2”和“5”的轻微错位。

在真实数据中,每个图中都有多个组。使用 gtable 不是必需的,只要符合我的要求就行。

0 投票
2 回答
3203 浏览

r - ggplot2: Using gtable to move strip labels to top of panel for facet_grid

I am creating a graphic using facet_grid to facet a categorical variable on the y-axis. I decided not to use facet_wrap because I need space = 'free' and labeller = label_parsed. My labels are long and I have a legend on the right so I would like to move the labels from the right of the panel to the top of the panel.

Here is an example to show where I'm getting stuck.

mt.png

Now I would like to move the strip text from the right of each panel to the top of each panel. I can store the grobs for the strip labels and remove them from the plot:

But now I'm stuck when it comes to rbind-ing the grobs back so the labels go to the top of the panels.

Another possible solution would be to use facet_wrap and then re-size the panels as discussed in another question, but in that case I would have to manually change the labels on the facets because there is no labeller = label_parsed for facet_wrap.

I'd appreciate suggestions on either approach!

Thanks for reading,

Tom

0 投票
1 回答
1781 浏览

r - 如何将图例高度设置为与绘图区域的高度相同?

我已经安排了两个图:顶部的折线图和下面的热图。

我希望热图图例与热图的绘图区域具有相同的高度,即与 y 轴相同的长度。我知道我可以使用 更改图例的高度和大小theme(legend.key.height = unit(...)),但是在我找到合适的设置之前,这需要多次试验和错误。

有没有办法指定图例的高度,使其与热图绘图区域的高度完全相同,并在绘制到 pdf 时保留该比率?

我尝试过的代码的可重现示例:

我的实际数据有更多类别,但要点是相同的。 是使用上面的代码生成的图像,并带有我想要做的注释。

提前致谢!马丁

0 投票
1 回答
1796 浏览

r - 双 y 轴和 facet_wrap

如何将转换后的比例放在 ggplot2 的右侧?展示了如何通过操纵 ggplot2 对象并将其与 gtable 合并来在同一个图中添加两个 y 轴。从那里的示例中,我设法将其扩展为与 facet_wrap 一起使用。请参见下面的示例。

然而,有三件事并不完美。

  1. 天平总是放在最右边。如果它与最后一行的情节联系起来会更好
  2. scales="free_y"如果所有图上分别有 y 轴(即您输入facet_wrap),则它不起作用
  3. 如果我将网格线留在(注释掉的线)中,第二个图的网格线出现在第一个图的前面。

如果有解决这些公认的小问题的聪明方法有什么想法吗?

带有双轴的 facet_wrap