背景
我有一种Gantt chart,由水平线段组成,不同的事件用不同形状的符号标记。我希望符号与段具有完全相同的高度(下一个问题的潜在主题!),并且符号应该在每个段中居中对齐。
问题:
问题是不同的形状似乎有不同的对齐方式。在我的小例子中,<canvas id="canvas" width="300" height="300"></canvas>
0,3,4,5是中心对齐的(左起第四个符号)。相反,圆和两个三角形是偏移的。
shape
我也拼命尝试使用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” - 我错过了任何关键字吗?
问题: 如何在不进行硬编码的情况下对齐不同的形状?
答案 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"))
因此我认为不太可能有任何ggplot2选项可以修复它。正如RolandASc指出的那样,我认为最好的办法是修改源数据以调整符号的偏移量,但我相信这在实践中非常危险,个人不建议这样做。
答案 2 :(得分:1)
您有四种选择:
根据需要编写(/改编)一个新的R图形设备中心点 - 例如,您可以查看gridSVG
让R-core接受对底层绘图例程的修改(如果你有一个很好的用例,它们可能会对一个不间断的新选项开放以使这些点居中)
< / LI>在ggplot2级别创建一个新geom,使用硬编码偏移量包裹geom_point以撤消引擎中的光学偏移
创建一个不依赖于这些形状但绘制自己设计多边形的新geom