我想根据Watts-Strogatz模型的参数p绘制聚类系数和平均最短路径,如下所示:
这是我的代码:
library(igraph)
library(ggplot2)
library(reshape2)
library(pracma)
p <- #don't know how to generate this?
trans <- -1
path <- -1
for (i in p) {
ws_graph <- watts.strogatz.game(1, 1000, 4, i)
trans <-c(trans, transitivity(ws_graph, type = "undirected", vids = NULL,
weights = NULL))
path <- c(path,average.path.length(ws_graph))
}
#Remove auxiliar values
trans <- trans[-1]
path <- path[-1]
#Normalize them
trans <- trans/trans[1]
path <- path/path[1]
x = data.frame(v1 = p, v2 = path, v3 = trans)
plot(p,trans, ylim = c(0,1), ylab='coeff')
par(new=T)
plot(p,path, ylim = c(0,1), ylab='coeff',pch=15)
Run Code Online (Sandbox Code Playgroud)
我应该如何制作这个X轴?
您可以p使用以下代码生成使用值:
p <- 10^(seq(-4,0,0.2))
Run Code Online (Sandbox Code Playgroud)
您希望x值以log10刻度均匀分布。这意味着您需要将均匀间隔的值作为以10为底的指数,因为log10刻度取x值的log10,这与操作正好相反。
有了这个,您已经很遥远了。您不需要par(new=TRUE),您可以简单地使用函数plot后面的函数points。后者不会重绘整个情节。使用参数log = 'x'告诉R您需要对数x轴。这仅需要在plot函数中进行设置,该points函数和所有其他低级绘图函数(不替换但添加到绘图中的那些函数)均遵循此设置:
plot(p,trans, ylim = c(0,1), ylab='coeff', log='x')
points(p,path, ylim = c(0,1), ylab='coeff',pch=15)
Run Code Online (Sandbox Code Playgroud)
编辑:如果要复制上图的对数轴外观,则必须自己计算。在互联网上搜索“ R log10次刻度”或类似内容。下面是一个简单的函数,可以计算对数轴主刻度线和副刻度线的适当位置
log10Tck <- function(side, type){
lim <- switch(side,
x = par('usr')[1:2],
y = par('usr')[3:4],
stop("side argument must be 'x' or 'y'"))
at <- floor(lim[1]) : ceil(lim[2])
return(switch(type,
minor = outer(1:9, 10^(min(at):max(at))),
major = 10^at,
stop("type argument must be 'major' or 'minor'")
))
}
Run Code Online (Sandbox Code Playgroud)
定义此功能后,通过使用上面的代码,您可以在函数内部调用该axis(...)函数,以绘制轴。建议:将函数保存在自己的R脚本中,然后使用函数将该脚本导入计算的顶部source。这样,您可以在以后的项目中重用该功能。在绘制轴之前,必须防止plot绘制默认轴,因此请将参数添加axes = FALSE到plot调用中:
plot(p,trans, ylim = c(0,1), ylab='coeff', log='x', axes=F)
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用新功能生成的刻度位置生成轴:
axis(1, at=log10Tck('x','major'), tcl= 0.2) # bottom
axis(3, at=log10Tck('x','major'), tcl= 0.2, labels=NA) # top
axis(1, at=log10Tck('x','minor'), tcl= 0.1, labels=NA) # bottom
axis(3, at=log10Tck('x','minor'), tcl= 0.1, labels=NA) # top
axis(2) # normal y axis
axis(4) # normal y axis on right side of plot
box()
Run Code Online (Sandbox Code Playgroud)
第三种选择是,在原始帖子中导入ggplot2时:与ggplot相同,但没有上述所有内容:
# Your data needs to be in the so-called 'long format' or 'tidy format'
# that ggplot can make sense of it. Google 'Wickham tidy data' or similar
# You may also use the function 'gather' of the package 'tidyr' for this
# task, which I find more simple to use.
d2 <- reshape2::melt(x, id.vars = c('v1'), measure.vars = c('v2','v3'))
ggplot(d2) +
aes(x = v1, y = value, color = variable) +
geom_point() +
scale_x_log10()
Run Code Online (Sandbox Code Playgroud)