gpt4 book ai didi

r - ggplot2的二分网络图

转载 作者:行者123 更新时间:2023-12-04 11:40:59 24 4
gpt4 key购买 nike

我有以下数据框:

structure(list(X1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L,
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L
), .Label = c("1", "2", "3", "4", "5", "6"), class = "factor"),
X2 = structure(c(1L, 6L, 8L, 10L, 12L, 13L, 3L, 4L, 1L, 6L,
7L, 9L, 10L, 12L, 13L, 3L, 4L, 5L, 10L, 12L, 13L, 4L, 1L,
6L, 12L, 13L, 3L, 1L, 6L, 7L, 8L, 10L, 11L, 12L, 13L, 2L,
3L, 11L, 12L, 13L), .Label = c("I1", "I10", "I11", "I12",
"I13", "I2", "I3", "I4", "I5", "I6", "I7", "I8", "I9"), class = "factor")), .Names = c("X1",
"X2"), row.names = c(NA, -40L), class = "data.frame")

在X1中是人员编号,在X2中是人员所属的组。一个人可以在不同的组中。
现在,我要从每个人到他所属的每个组划一条界线。使用 plot()我通过以下方式解决了它:
plot(0, xlim=c(0,1), ylim=c(0,1), type="n", axes=FALSE, xlab="", ylab="")

factor.to.int <- function(f) {
(as.integer(f) - 1) / (length(levels(f)) - 1)
}

segments(factor.to.int(data$X1), 0, factor.to.int(data$X2), 1, col=data$X1)
axis(1, at = seq(0, 1, by = 1 / (length(levels(data$X1)) - 1)), labels = levels(data$X1))
axis(3, at = seq(0, 1, by = 1 / (length(levels(data$X2)) - 1)), labels = levels(data$X2))

结果看起来像这样:

现在我想知道如何使用ggplot2做到这一点?

谢谢你的帮助!

最佳答案

通过使用ggplot2并像对基本图形版本所做的那样非常转换数据,可以实现图形的简单geom_segment()版本。我还使用ggplot2中的一些更高级的自定义选项提供了一个可以说更完善的版本。

# Using ggplot2 version 0.9.2.1
library(ggplot2)

dat$x1_norm = rangeTransform(as.integer(dat$X1))
dat$x2_norm = rangeTransform(as.integer(dat$X2))

dat$y1 = 0
dat$y2 = 1

# Simple version.
p1 = ggplot(dat, aes(x=x1_norm, xend=x2_norm, y=y1, yend=y2, colour=X1)) +
geom_segment(size=1.2) +
scale_colour_brewer(palette="Set1", name="Person")

ggsave(plot=p1, filename="plot_1.png", height=3.5, width=6)
# Fancy version.
# Create separate data.frames to manually specify axis ticks and axis text.
axis_1 = data.frame(x=rangeTransform(as.integer(unique(dat$X1))),
y=0, label=as.character(unique(dat$X1)))

axis_2 = data.frame(x=rangeTransform(as.integer(unique(dat$X2))),
y=1, label=as.character(unique(dat$X2)))

p2 = ggplot(data=dat) +
theme_bw() +
theme(axis.title=element_blank()) +
theme(axis.text=element_blank()) +
theme(axis.ticks=element_blank()) +
theme(panel.grid=element_blank()) +
geom_segment(aes(x=x1_norm, xend=x2_norm, y=y1, yend=y2, colour=X1),
size=1.2) +
geom_segment(x=0, xend=1, y=0, yend=0, size=0.7) +
geom_segment(x=0, xend=1, y=1, yend=1, size=0.7) +
scale_colour_brewer(palette="Set1", name="Person") +
scale_y_continuous(limits=c(-0.2, 1.2), expand=c(0, 0)) +
geom_segment(data=axis_1, aes(x=x, xend=x, y=y, yend=y-0.025), size=0.7) +
geom_segment(data=axis_2, aes(x=x, xend=x, y=y, yend=y+0.025), size=0.7) +
geom_text(data=axis_1, aes(label=label, x=x, y=y - 0.075)) +
geom_text(data=axis_2, aes(label=label, x=x, y=y + 0.075))

ggsave(plot=p2, filename="plot_2.png", height=3.5, width=6)

关于r - ggplot2的二分网络图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com