- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务是根据下面的观察结果拟合分类树模型。然后我必须将树放置在现有数据之上。建议我使用 p + geom_contour(....)
但我对 ggplot 不太熟悉。
我提供的代码如下。
我可以相当容易地将树模型拟合到数据,但绘制它只能产生决策树。如何使用geom_contour
在现有绘图上叠加树模型?
library(tidyverse)
set.seed(1234)
dat <- tibble(
x1 = rnorm(100),
x2 = rnorm(100)
) %>% mutate(y = as_factor(ifelse(x1^2 + x2^2 > 1.39, "A", "B")))
circlepts <- tibble(theta = seq(0, 2*pi, length = 100)) %>%
mutate(x = sqrt(1.39) * sin(theta), y = sqrt(1.39) * cos(theta))
p <- ggplot(dat) + geom_point(aes(x1, x2, color = y)) + coord_fixed() +
geom_polygon(data = circlepts, aes(x, y), color = "blue", fill = NA)
p
为了使树模型适合数据,我输入
library(tree)
tree_fit <- tree(y~., dat)
叠加层只是适合数据的决策树,例如像这样的东西(用 MS Paint 粗略地绘制)
最佳答案
我不认为 geom_contour
是执行此操作的方法,但您可以从 tree_fit
的基础数据框中获取线段的坐标,并执行一些争论逐步将每个片段限制在图中仍然“事件”的区域:
tree.df.segment <- tree_fit$frame %>%
rownames_to_column() %>%
mutate(rowname = as.integer(rowname),
depth = tree:::tree.depth(rowname),
split = splits[, 1] %>%
gsub("<|>", "", .) %>%
as.numeric()) %>%
arrange(depth, rowname) %>%
mutate(leaf.position = case_when(lead(depth) > depth & lead(var) == "<leaf>" ~ "left",
lead(depth) > depth & lead(var) != "<leaf>" ~ "right",
TRUE ~ NA_character_)) %>%
fill(leaf.position, .direction = "up") %>%
filter(var != "<leaf>") %>%
select(depth, var, split, leaf.position) %>%
# define basic segment coordinates
mutate(x = -Inf, xend = Inf, y = -Inf, yend = Inf,
xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) %>%
# modify coordinates of segment / active area based on split
mutate(x = ifelse(var == "x1", split, x),
xend = ifelse(var == "x1", split, xend),
y = ifelse(var == "x2", split, y),
yend = ifelse(var == "x2", split, yend),
xmin = ifelse(var == "x1" & leaf.position == "left", split, xmin),
xmax = ifelse(var == "x1" & leaf.position == "right", split, xmax),
ymin = ifelse(var == "x2" & leaf.position == "left", split, ymin),
ymax = ifelse(var == "x2" & leaf.position == "right", split, ymax)) %>%
# shrink active area progressively as depth increases
mutate(xmin = cummax(xmin), xmax = cummin(xmax),
ymin = cummax(ymin), ymax = cummin(ymax)) %>%
# limit segment coordinates to within active area
mutate(x = pmax(x, xmin), xend = pmin(xend, xmax),
y = pmax(y, ymin), yend = pmin(yend, ymax))
p +
geom_segment(data = tree.df.segment,
aes(x = x, xend = xend, y = y, yend = yend))
<小时/>
此外(因为我认为这之后肯定会被问到),我们可以使用geom_rect
将与终端叶子相对应的每个区域遮蔽为矩形。这将需要一些额外的争论。
tree.df.rect <- tree.df.segment %>%
mutate(depth = depth + 1) %>%
select(-c(x, xend, y, yend)) %>%
mutate_at(vars(xmin, xmax, ymin, ymax), list(rect = lag)) %>%
mutate_at(vars(xmin_rect, ymin_rect), ~ifelse(is.na(.), -Inf, .)) %>%
mutate_at(vars(xmax_rect, ymax_rect), ~ifelse(is.na(.), Inf, .)) %>%
mutate(xmin_rect = ifelse(var == "x1" & leaf.position == "right", split, xmin_rect),
xmax_rect = ifelse(var == "x1" & leaf.position == "left", split, xmax_rect),
ymin_rect = ifelse(var == "x2" & leaf.position == "right", split, ymin_rect),
ymax_rect = ifelse(var == "x2" & leaf.position == "left", split, ymax_rect)) %>%
# add label for each rect
full_join(tree_fit$frame %>%
rownames_to_column() %>%
mutate(rowname = as.integer(rowname),
depth = tree:::tree.depth(rowname),
split = splits[, 1] %>%
gsub("<|>", "", .) %>%
as.numeric()) %>%
filter(var == "<leaf>") %>%
select(depth, rowname, yval) %>%
arrange(depth, rowname))
# since last split is associated with two rectangles, determine which is the last 'active'
# one in order to assign the labels correctly (doesn't matter in this case since the last
# two labels are both 'B', but this should apply more generally)
if(tree.df.rect %>% filter(depth == max(depth)) %>% pull(leaf.position) %>% unique() == "left") {
tree.df.rect[nrow(tree.df.rect), c("xmin_rect", "xmax_rect", "ymin_rect", "ymax_rect")] <-
tree.df.rect[nrow(tree.df.rect), c("xmin", "xmax", "ymin", "ymax")]
} else {
tree.df.rect[nrow(tree.df.rect)-1, c("xmin_rect", "xmax_rect", "ymin_rect", "ymax_rect")] <-
tree.df.rect[nrow(tree.df.rect)-1, c("xmin", "xmax", "ymin", "ymax")]
}
tree.df.rect <- tree.df.rect %>%
select(depth, yval, xmin_rect, xmax_rect, ymin_rect, ymax_rect)
# combine into one data frame
tree.df <- full_join(
tree.df.rect %>%
select(depth, yval, xmin_rect, xmax_rect, ymin_rect, ymax_rect),
tree.df.segment %>%
select(depth, x, xend, y, yend)
)
p.shaded <- ggplot(data = tree.df) +
geom_point(data = dat, aes(x1, x2, color = y)) +
geom_polygon(data = circlepts, aes(x, y), color = "blue", fill = NA) +
geom_rect(aes(xmin = xmin_rect, xmax = xmax_rect,
ymin = ymin_rect, ymax = ymax_rect,
fill = yval),
alpha = 0.25) +
geom_segment(aes(x = x, xend = xend, y = y, yend = yend)) +
coord_fixed() +
labs(color = "", fill = "") +
scale_fill_discrete(breaks = c("A", "B"))
p.shaded
可以轻松地进一步扩展为动画形式:
library(gganimate)
p.anim <- p.shaded +
transition_states(depth) +
shadow_mark() +
enter_fade() +
labs(title = "{closest_state}")
animate(p.anim, nframes = 10, fps = 1)
关于r - 使用 ggcontour 在数据集上覆盖树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735981/
我知道 C++ 中的 overriding 是什么。但是,是否存在覆盖?如果有,是什么意思? 谢谢。 最佳答案 在 C++ 术语中,您有 覆盖(与类层次结构中的虚拟方法相关)和 重载(与具有相同名称但
我想捕获位于另一个元素下的元素的鼠标事件。 这是我所拥有的示例:http://jsfiddle.net/KVLkp/13/ 现在我想要的是当鼠标悬停在红色方 block 上时蓝色方 block 有黄色
以下报道 here我尝试创建一个带有重叠散点图的箱线图。 但是当我运行时: In [27]: table1.t_in[table1.duration==6] Out[27]: counter 7
有一个 JS Fiddle here , 你能在不克隆到新对象的情况下替换 e.target 吗? 下面重复了那个 fiddle 的听众; one.addEventListener('click',
首先要解决重复的可能性: 我不是询问 Override 是什么、它的含义或 @Override 在 java 文档注释之外。那是我不是问 /**Some JavaDoc Comment*/ @over
我想要高于定义的数组。它存储点及其坐标。 public static List simpleGraph(List nodes) { int numEdges = nodes.size() *
我在 http://olisan.dk/blog/ 有一个博客- 如您所见,有一个 28 像素的高间隙(边距顶部)...在 style.css 中: margin-top: 0; 也被设置为 marg
Vulkan 句柄是指向 struct 的不透明指针,或者只是无符号的 64 位整数,具体取决于 VK_USE_64_BIT_PTR_DEFINES 的值: #if (VK_USE_64_BI
我正在尝试提供一个行为类似于 DataGridTextColumn 的 DataGrid 列,但在编辑模式下有一个附加按钮。我查看了 DataGridTemplateColumn,但似乎更容易将 Da
使用 Django 1.10 我想在用户名中允许\字符,因为我在使用“django.contrib.auth.middleware.RemoteUserMiddleware”的 Windows 环境中
我正在尝试使用 ffmpeg 将 Logo 放入 rtmp 流中。我的 ffmpeg 版本是 ffmpeg version 4.3.1目前在我的复杂过滤器中,我有: ffmpeg -re -i 'v
是否有用于Firebase 3存储的方法/规则来禁用文件更新或覆盖? 我为数据库找到了data.exists(),但没有为存储找到解决方案。 最佳答案 TL; DR:在Storage Security
我有两个 Docker Compose 文件,docker-compose.yml看起来像这样 version: '2' services: mongo: image: mongo:3.2
我需要覆盖 JPA 中的集合表吗?也许有人有想法 public class nationality{ @Embedded @AttributeOverrides({
嗨,我正在使用 WIX 和下面的代码将文件安装到目录中。 我的应用程序的工作方式是用户可以在该目录中复制他们自己的文件,覆盖他们喜欢的内容
我正在尝试为 Lua 中的字符串实现我自己的长度方法。 我已成功覆盖字符串的 len() 方法,但我不知道如何为 # 运算符执行此操作。 orig_len = string.len function
在Scala 2.10.4中,给出以下类: scala> class Foo { | val x = true | val f = if (x) 100 else 200
我想做上面的事情。 我过去覆盖了许多文件...... block ,模型,助手......但这个让我望而却步。 谁能看到我在这里做错了什么: (我编辑了这段代码......现在包括一些建议......
根据javadoc An instance method in a subclass with the same signature (name, plus the number and the ty
我有一段代码,只要有可用的新数据作为 InputStream 就会生成新数据。每次都覆盖同一个文件。有时文件在写入之前变为 0 kb。 Web 服务会定期读取这些文件。我需要避免文件为 0 字节的情况
我是一名优秀的程序员,十分优秀!