- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有曲线信息的 df
:
df <- data.frame(
x = c(0,0,1,1),
xend = c(0,1,1,0),
y = c(0,1,0,1),
yend = c(1,0,1,1),
curvature = c(-.2,-.5,.1,1)
)
我可以使用单独的曲率
参数绘制这些曲线(来自 here 的想法):
library(ggplot2)
ggplot(df) +
lapply(split(df, 1:nrow(df)), function(dat) {
geom_curve(data = dat, aes(x = x, y = y, xend = xend, yend = yend), curvature = dat["curvature"]) }
) + xlim(-1,2) + ylim(-1,2) + theme_void()
现在我想用相同的曲线重叠绘制该图像,但每条曲线应在开头和结尾处剪切约 10%。
首先,我认为我也许能够使用我的 gg 对象中的信息,但无法看到 ggplot2 存储信息的位置(另请参阅我的问题 here ) .
然后我尝试使用以下方法重新调整起点和终点:
offset <- function(from, to) return((to - from)/10)
recalculate_points <- function(df) {
df$x <- df$x + offset(df$x, df$xend)
df$xend = df$xend - offset(df$x, df$xend)
df$y = df$y + offset(df$y, df$yend)
df$yend = df$yend - offset(df$y, df$yend)
return(df)
}
df2 <- recalculate_points(df)
ggplot(df) +
lapply(split(df, 1:nrow(df)), function(dat) {
geom_curve(data = dat, aes(x = x, y = y, xend = xend, yend = yend), curvature = dat["curvature"]) }
) +
lapply(split(df2, 1:nrow(df2)), function(dat) {
geom_curve(data = dat, aes(x = x, y = y, xend = xend, yend = yend), curvature = dat["curvature"], color = "red") }
) + xlim(-1,2) + ylim(-1,2) + theme_void()
像这样我可以切割曲线的开头和结尾。但正如我们所见,红色曲线与原始黑色曲线不太吻合。
如何改进我的 offset
和 recalculate_points
函数,以使红色曲线适合黑色> 曲线更好?
甚至更好:我在哪里可以找到 gg
对象中的曲线信息以及如何使用该信息来重新缩放我的曲线?
注意:我不需要 100% 适合。但视觉上的贴合度应该有所改善。所以我的预期输出应该类似于:
最佳答案
我找到了第一个解决方案。这有点复杂,但似乎可行。改进和替代方案仍然非常受欢迎!
<小时/>我们开始:
x
、xend
、y
、yend
以拟合曲线;曲率
参数(它需要小一点)详细信息和代码:
第 0 步:初始化和默认绘图
df <- data.frame(
x = c(0,0,1,1),
xend = c(0,1,1,0),
y = c(0,1,0,1),
yend = c(1,0,1,1),
curvature = c(-.2,-.5,.1,1)
)
library(ggplot2)
gg <- ggplot(df) +
lapply(split(df, 1:nrow(df)), function(dat) {
geom_curve(data = dat, aes(x = x, y = y, xend = xend, yend = yend), curvature = dat["curvature"], color = "grey") }
) + xlim(-1,2) + ylim(-1,2) + theme_void()
gg
第 1 步:角度
angles <- function(df) {
df$theta <- atan2((df$y - df$yend), (df$x - df$xend))
df$theta_end <- df$theta + df$curvature * (pi/2)
df$theta <- atan2((df$yend - df$y), (df$xend - df$x))
df$theta_start <- df$theta - df$curvature * (pi/2)
return(df)
}
df <- angles(df)
df
x xend y yend curvature theta theta_end theta_start
1 0 0 0 1 -0.2 1.5707963 -1.884956 1.884956
2 0 1 1 0 -0.5 -0.7853982 1.570796 0.000000
3 1 1 0 1 0.1 1.5707963 -1.413717 1.413717
4 1 0 1 1 1.0 3.1415927 1.570796 1.570796
步骤 2 - 4:角度、矢量、重新计算的点和曲率
starts <- function(df, r) {
df$x <- cos(df$theta_start) * r + df$x
df$y <- sin(df$theta_start) * r + df$y
return(df)
}
df <- starts(df, .1)
ends <- function(df, r) {
df$xend <- cos(df$theta_end) * r + df$xend
df$yend <- sin(df$theta_end) * r + df$yend
return(df)
}
df <- ends(df, .1)
df$curvature <- df$curvature * .9
df
x xend y yend curvature theta theta_end theta_start
1 -0.0309017 -3.090170e-02 0.09510565 0.9048943 -0.18 1.5707963 -1.884956 1.884956
2 0.1000000 1.000000e+00 1.00000000 0.1000000 -0.45 -0.7853982 1.570796 0.000000
3 1.0156434 1.015643e+00 0.09876883 0.9012312 0.09 1.5707963 -1.413717 1.413717
4 1.0000000 6.123032e-18 1.10000000 1.1000000 0.90 3.1415927 1.570796 1.570796
最终情节
gg + lapply(split(df, 1:nrow(df)), function(dat) {
geom_curve(data = dat, aes(x = x, y = y, xend = xend, yend = yend), curvature = dat["curvature"], color = "blue") }
) + xlim(-1,2) + ylim(-1,2) + theme_void()
关于r - 使用 `ggplot2` 使用另一条具有相同位置但在 `geom_curve` 中剪切开头和结尾的曲线来重叠曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55688698/
是 if(a == 0 && b == 0 && c == 0) { return; } 一样 if(a == 0) { return; } if(b == 0) { return; } if(c =
我想做这样的事情: Class A Class B extends A Class C extends A B b = new B(); C c = new C(); b->setField("foo
我对 Mysql 世界很天真......:)我试图使用连接从表中查询, 我遇到结果集问题...表结构如下 下面... VIDEO_XXXXX | Field | Type
我最近问过关于从另一个类获取类的唯一实例的问题。 ( How to get specific instance of class from another class in Java? ) 所以,我正
假设我们有两种类型 using t1 = int*; using t2 = int*; 我知道 std::is_same::value会给我们true .什么是,或者是否有模板工具可以实现以下目标?
对于我的一个应用程序,我假设比较 2 个字符串的第一个字符比比较整个字符串是否相等要快。例如,如果我知道只有 2 个可能的字符串(在一组 n 字符串中)可以以相同的字母开头(比如说 'q'),如果是这
我想在我的NXP LPC11U37H主板(ARM Cortex-M0)上分析一些算法,因为我想知道执行特定算法需要多少个时钟周期。 我编写了这些简单的宏来进行一些分析: #define START_C
我在 Excel 中创建了一个宏,它将在 Excel 中复制一个表格,并将行除以我确定的特定数字(默认 = 500 行),并为宏创建的每个部门打开不同的工作表。 使用的代码是这样的: Sub Copy
我想根据第一个字典对第二个字典的值求和。如果我有字典 A 和 B。 A = {"Mark": ["a", "b", "c", "d"], "June": ["e", "a"], "John": ["a
当我这样做时 system()在 Perl 中调用,我通常根据 perldocs 检查返回码.嗯,我是这么想的。大部分时间 $rc!=0对我来说已经足够了。最近我在这里帮助了两个遇到问题的人syste
在我的进度条上,我试图让它检测 div 加载速度。 如果 div 加载速度很快,我想要实现的目标将很快达到 100%。但进度条的加载速度应该与 div 的加载速度一样快。 问题:如何让我的进度条加载
当我获得与本地时间相同的时间戳时,firebase 生成的服务器时间戳是否会自动转换为本地时间,或者我错过了什么? _firestore.collection("9213903123").docume
根据the original OWL definition of OWL DL ,我们不能为类和个体赋予相同的名称(这是 OWL DL 和 OWL Full 之间的明显区别)。 "Punning" i
我有两个输入复选框: 尝试使用 jQuery 来允许两个输入的行为相同。如果选中第一个复选框,则选中第二个复选框。如果未检查第 1 个,则不会检查第 2 个。反之亦然。 我有代码: $('inpu
可以从不同系统编译两个相同的java文件,但它们都有相同的内容操作系统(Windows 7),会生成不同的.class文件(大小)? 最佳答案 是的,您可以检查是否有不同版本的JDK(Java Dev
我正在清理另一个人的正则表达式,他们目前所有的都以结尾 .*$ 那么下面的不是完全一样吗? .* 最佳答案 .*将尽可能匹配,但默认情况下为 .不匹配换行符。如果您要匹配的文本有换行符并且您处于 MU
我使用 Pick ,但是如何编写可以选择多个字段的通用PickMulti呢? interface MyInterface { a: number, b: number, c: number
我有一个 SQL 数据库服务器和 2 个具有相同结构和数据的数据库。我在 2 个数据库中运行相同的 sql 查询,其中一个需要更长的时间,而另一个在不到 50% 的时间内完成。他们都有不同的执行计划。
我需要你的帮助,我有一个包含两列的表,一个 id 和 numpos,我希望 id 和 numops 具有相同的结果。 例子: $cnx = mysql_connect( "localhost", "r
如何将相同的列(在本例中按“级别”排序)放在一起?我正在做一个高分,我从我的数据库中按级别列出它们。如果他们处于同一级别,我希望他们具有相同的 ID。 但是我不想在别人身上显示ID。只有第一个。这是一
我是一名优秀的程序员,十分优秀!