- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当大小不同时,我一直试图在ggplot2或grid中绘制线段间距相等的线。但是,我还没有成功,所以请您帮忙。
在下面的示例中,如何在线段大小不同的情况下使线段之间的绝对间距相等?
我想避免制作自定义的makeContent.myclass
方法来自己控制。
library(ggplot2)
library(grid)
df <- data.frame(
x = c(1:2, 1:2),
y = c(1:2, 2:1),
size = c(1,1,10,10)
)
# In ggplot2
ggplot(df, aes(x, y, size = size, group = size)) +
geom_line(linetype = 2)
# In grid
lines <- polylineGrob(
x = scales::rescale(df$x),
y = scales::rescale(df$y),
id = c(1,1,2,2),
gp = gpar(lty = 2, lwd = c(1, 10))
)
grid.newpage(); grid.draw(lines)
最佳答案
这可能不是您在寻找Teunbrand的目的,但我想您可以将线条转换为一系列沿线条等距分布的细多边形多边形。
此函数采用一系列x和y坐标,并返回虚线(作为单个treeGrob)。根据您的示例,它以归一化的npc坐标返回它。您可以完全控制线宽,划线长度和中断长度(尽管不是图案)以及颜色。恐怕这些单位有些随意,这与生产标准相差甚远,但这是相当有效的:
segmentify <- function(x, y, linewidth = 1, dash_len = 1,
break_len = 1, col = "black")
{
linewidth <- 0.002 * linewidth
dash_len <- 0.01 * dash_len
break_len <- 0.04 * break_len
if(length(y) != length(x))
stop("x and y must be the same length")
if(!is.numeric(x) | !is.numeric(y))
stop("x and y must be numeric vectors")
if(length(x) < 2)
stop("Insufficient x, y pairs to make line.")
x <- scales::rescale(x)
y <- scales::rescale(y)
n_dashes <- 0
skip_len <- break_len + dash_len
df <- list()
for(i in seq_along(x)[-1])
{
x_diff <- x[i] - x[i - 1]
y_diff <- y[i] - y[i - 1]
seg_len <- sqrt(x_diff^2 + y_diff^2)
seg_prop <- skip_len / seg_len
dist_from_start <- n_dashes * skip_len
prop_start <- dist_from_start/seg_len
x_start <- x[i-1] + prop_start * x_diff
y_len <- y_diff * seg_prop
x_len <- x_diff * seg_prop
y_start <- y[i-1] + prop_start * y_diff
n_breaks <- (seg_len - dist_from_start)/skip_len
n_dashes <- (n_dashes + n_breaks) %% 1
n_breaks <- floor(n_breaks)
if(n_breaks)
{
df[[length( df) + 1]] <- data.frame(
x = seq(x_start, x[i], by = x_len),
y = seq(y_start, y[i], by = y_len)
)
df[[length( df)]]$theta <-
atan(rep(y_diff/x_diff, length( df[[length( df)]]$x)))
}
}
df <- do.call(rbind, df)
df$x1 <- df$x + sin( df$theta) * linewidth + cos(df$theta) * dash_len
df$x2 <- df$x + sin( df$theta) * linewidth - cos(df$theta) * dash_len
df$x3 <- df$x - sin( df$theta) * linewidth - cos(df$theta) * dash_len
df$x4 <- df$x - sin( df$theta) * linewidth + cos(df$theta) * dash_len
df$y1 <- df$y - cos( df$theta) * linewidth + sin(df$theta) * dash_len
df$y2 <- df$y - cos( df$theta) * linewidth - sin(df$theta) * dash_len
df$y3 <- df$y + cos( df$theta) * linewidth - sin(df$theta) * dash_len
df$y4 <- df$y + cos( df$theta) * linewidth + sin(df$theta) * dash_len
do.call(grid::grobTree, lapply(seq(nrow(df)), function(i) {
grid::polygonGrob(c(df$x1[i], df$x2[i], df$x3[i], df$x4[i]),
c(df$y1[i], df$y2[i], df$y3[i], df$y4[i]),
gp = gpar(col = "#00000000", lwd = 0, fill = col))
}))
}
使用起来相当简单:
set.seed(2)
x <- 1:10
y <- rnorm(10)
grid::grid.newpage()
grid::grid.draw(segmentify(x, y))
grid::grid.newpage()
grid::grid.draw(segmentify(x, y, linewidth = 3))
grid::grid.newpage()
grid::grid.draw(segmentify(x, y, linewidth = 2, break_len = 0.5, col = "forestgreen"))
关于r - 如何在不考虑线尺寸的情况下保持线型间距恒定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63061601/
我是 ggplot 的新手,所以请耐心等待。我正在绘制 35 个小区域地理的增长预测,即使使用了很棒的 directlabels 对于一个地块来说,这是一个不健康的数量。图书馆。但是我需要所有系列进行
在我下面的图表中,我希望图例反射(reflect)实际的线型,即“距离”的蓝线也应该在图例中用虚线表示。我如何实现这一目标? 在我的代码下面。谢谢! data <- structure(list(Ye
我有一个使用 step-before 插值的折线图(尽管如果使用 step-after,同样的问题也适用)。我希望垂直线段的颜色比水平线段的颜色浅。我怎样才能做到这一点? 最佳答案 单一路径必须是单一
我正在使用 React 和 Google Charts,我刚刚发现一个我找不到解决方案的问题。 我有这个组件 这里是数据和选项的值: const data = [ ["Year",
我是一名优秀的程序员,十分优秀!