我想使用强大的 ggparty 包绘制决策树(由 partykit 包估计)。除了数字拆分变量的小数位数外,一切都很好。我如何格式化geom_edge_label()
中的breaks_label
,例如,将> 75.33333
更改为> 75.3
下面的情节? round()
不起作用。我可能会通过一般的 options(digits = 3)
使用解决方法,但我想知道是否有更直接的方法。
library("ggparty")
data("WeatherPlay", package = "partykit")
sp_o <- partysplit(1L, index = 1:3)
sp_h <- partysplit(3L, breaks = 75 + 1/3)
sp_w <- partysplit(4L, index = 1:2)
pn <- partynode(1L, split = sp_o, kids = list(
partynode(2L, split = sp_h, kids = list(
partynode(3L, info = "yes"),
partynode(4L, info = "no"))),
partynode(5L, info = "yes"),
partynode(6L, split = sp_w, kids = list(
partynode(7L, info = "yes"),
partynode(8L, info = "no")))))
py <- party(pn, WeatherPlay)
ggparty(py) +
geom_edge() +
# geom_edge_label() +
geom_edge_label(mapping = aes(label = paste(breaks_label))) +
geom_node_splitvar() +
geom_node_info()
由 reprex package 创建于 2020-03-05 (v0.3.0)
最佳答案
感谢使用 ggparty!
所以我认为,对于当前版本确实没有直接的解决方案。但我会确保在未来实现它!
通常,通过仅在节点的子集上使用 geom,通常可以解决很多问题。正如您已经注意到的那样,breaks_label 不是存储为数字,而是存储为带有一些可解析文本的字符,用于表示它们前面的不等号。因此,您必须使用类似 substr() 的方法。
ggparty(py) +
geom_edge() +
geom_edge_label(id = -c(3, 4)) +
geom_edge_label(mapping = aes(label = paste(substr(breaks_label, start = 1, stop = 15))),
id = c(3, 4)) +
geom_node_splitvar() +
geom_node_info()
我还修改了一个内部函数以包含舍入功能,因此您可以从 github 获取并使用它。但我还没有真正测试过,所以使用风险自负;)
library(devtools)
source_url("https://raw.githubusercontent.com/martin-borkovec/ggparty/martin/R/add_splitvar_breaks_index_new.R")
rounded_labels <- add_splitvar_breaks_index_new(party_object = py,
plot_data = ggparty:::get_plot_data(py),
round_digits = 2)
ggparty(py) +
geom_edge() +
geom_edge_label(mapping = aes(label = unlist(rounded_labels)),
data = rounded_labels) +
geom_node_splitvar() +
geom_node_info()
关于r - 使用 ggparty 的决策 TreeMap 边缘的小数位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60553985/