对齐不同的绘图形状

时间:2017-04-02 11:46:43

标签: r plot ggplot2 alignment

背景

我有一种Gantt chart,由水平线段组成,不同的事件用不同形状的符号标记。我希望符号与段具有完全相同的高度(下一个问题的潜在主题!),并且符号应该在每个段中居中对齐

问题:

问题是不同的形状似乎有不同的对齐方式。在我的小例子中,<canvas id="canvas" width="300" height="300"></canvas> 0,3,4,5是中心对齐的(左起第四个符号)。相反,圆和两个三角形是偏移的。

shape

enter image description here

放大PDF输出: enter image description here

我也拼命尝试使用unicode符号d1 <- data.frame(x = -1, xend = 7, y = 1, yend = 1) d2 <- data.frame(x = 0:6, y = 1) library(ggplot2) ggplot(data = d1, aes(x = x, y = y)) + geom_segment(aes(xend = xend, yend = yend), size = 8, color = "grey80") + geom_segment(aes(xend = xend, yend = yend), color = "red") + geom_point(data = d2, shape = c(0, 3, 4, 5, 1, 2, 6), size = 8) + theme_void() 。然而,现在更难以对齐。

geom_text

geom_text(data = d2, label = c("\u25A1", "\uFF0B","\u2715","\u25C7", "\u25CB", "\u25B3", "\u25BD"), size = 8, vjust = "center") ?geom_point?aes_linetype_size_shape中没有明显的提示。我用google搜索“r plot align center justify symbol shape pch” - 我错过了任何关键字吗?

问题: 如何在不进行硬编码的情况下对齐不同的形状?

3 个答案:

答案 0 :(得分:6)

这不是一个真正的答案,但不符合评论。

对我而言,圆圈并不比正方形更差,并且查看所有前26个符号(<div class="block-arr"> <div class="inner"><div class="bordered"> <p><strong>Main Heading</strong> <span>Sub Heading</span></p> </div></div> </div>),似乎(理论上,不确定各种设备)只有三角形不适合你的目的。
我认为它们代表的点位于它们的质量中心通常是合理的,因为这是眼睛期望它与这些符号的最常见用例。

群众中心的证明如下: https://github.com/wch/r-source/blob/91dda45a5e4e418d0efed17db858736a973d4996/src/main/engine.c

pch = 0:25

void GESymbol(...

所以你当然可以修改源代码来说:

case 2: /* S triangle - point up */ xc = RADIUS * GSTR_0; r = toDeviceHeight(TRC0 * xc, GE_INCHES, dd); yc = toDeviceHeight(TRC2 * xc, GE_INCHES, dd); xc = toDeviceWidth(TRC1 * xc, GE_INCHES, dd); xx[0] = x; yy[0] = y+r; xx[1] = x+xc; yy[1] = y-yc; xx[2] = x-xc; yy[2] = y-yc; gc->fill = R_TRANWHITE; GEPolygon(3, xx, yy, gc, dd); break;

yy[0] = y + (r+yc)/2;

yy[1] = y - (r+yc)/2;

答案 1 :(得分:2)

我感觉这个问题没有解决方案(至少没有一个合理可行的解决方案)。问题本身似乎植根于网格,这就是ggplot2的基础。例如:

library(grid)
grid.newpage()
vp <- viewport()
pushViewport(vp)
grid.rect(x = 0.5 , y = 0.5 , width= 1 , height = 0.14)
grid.points(x = 0.1 , y = 0.5, pch = 0 ,size = unit(1,"in"))
grid.points(x = 0.3 , y = 0.5, pch = 24 ,size = unit(1,"in"))
grid.points(x = 0.5 , y = 0.5, pch = 25  ,size = unit(1,"in"))

enter image description here

因此我认为不太可能有任何ggplot2选项可以修复它。正如RolandASc指出的那样,我认为最好的办法是修改源数据以调整符号的偏移量,但我相信这在实践中非常危险,个人不建议这样做。

答案 2 :(得分:1)

您有四种选择:

  1. 根据需要编写(/改编)一个新的R图形设备中心点 - 例如,您可以查看gridSVG

  2. 让R-core接受对底层绘图例程的修改(如果你有一个很好的用例,它们可能会对一个不间断的新选项开放以使这些点居中)

    < / LI>
  3. 在ggplot2级别创建一个新geom,使用硬编码偏移量包裹geom_point以撤消引擎中的光学偏移

  4. 创建一个不依赖于这些形状但绘制自己设计多边形的新geom