R 中的对数标度图 [英] Logarithmic scale plot in R

查看:57
本文介绍了R 中的对数标度图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想绘制聚类系数和平均最短-路径作为 Watts-Strogatz 模型参数 p 的函数如下:

I want to plot the clustering coefficient and the average shortest- path as a function of the parameter p of the Watts-Strogatz model as following:

这是我的代码:

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)

我应该如何制作这个 x 轴?

How should I proceed to make this x-axis?

推荐答案

您可以使用如下代码生成 p 的值:

You can generate the values of p using code like the following:

p <- 10^(seq(-4,0,0.2))

您希望 x 值在 log10 尺度上均匀分布.这意味着您需要采用均匀间隔的值作为以 10 为底的指数,因为 log10 比例采用 x 值的 log10,这是完全相反的操作.

You want your x values to be evenly spaced on a log10 scale. This means you need to take evenly spaced values as the exponent for the base 10, because the log10 scale takes the log10 of your x values, which is the exact opposite operation.

有了这个,你已经很远了.您不需要par(new=TRUE),您可以简单地使用函数plot 后跟函数points.后者不会重绘整个情节.使用参数 log = 'x' 告诉 R 你需要一个对数 x 轴.这只需要在 plot 函数、points 函数和所有其他低级绘图函数(那些不替换而是添加到绘图中的)中设置设置:

With this, you are already pretty far. You don't need par(new=TRUE), you can simply use the function plot followed by the function points. The latter does not redraw the whole plot. Use the argument log = 'x' to tell R you need a logarithmic x axis. This only needs to be set in the plot function, the points function and all other low-level plot functions (those who do not replace but add to the plot) respect this setting:

plot(p,trans, ylim = c(0,1), ylab='coeff', log='x')
points(p,path, ylim = c(0,1), ylab='coeff',pch=15)

如果您想复制上图的对数轴外观,您必须自己计算它们.在互联网上搜索R log10 minor ticks"或类似内容.下面是一个简单的函数,可以计算对数轴主要和次要刻度的适当位置

If you want to replicate the log-axis look of the above plot, you have to calculate them yourselves. Search the internet for 'R log10 minor ticks' or similar. Below is a simple function which can calcluate the appropriate position for log axis major and minor ticks

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'")
   ))
}

定义此函数后,通过使用上述代码,您可以调用axis(...) 函数内部的函数,该函数绘制轴.建议:将函数保存在它自己的 R 脚本中,并使用函数 source 在计算的顶部导入该脚本.通过这种方式,您可以在以后的项目中重复使用该功能.在绘制轴之前,您必须防止 plot 绘制默认轴,因此将参数 axes = FALSE 添加到您的 plot 调用中:

After you have defined this function, by using the above code, you can call the function inside the axis(...) function, which draws axes. As a suggestion: save the function away in its own R script and import that script at the top of your calculation using the function source. By this means, you can reuse the function in future projects. Prior to drawing the axes, you have to prevent plot from drawing default axes, so add the parameter axes = FALSE to your plot call:

plot(p,trans, ylim = c(0,1), ylab='coeff', log='x', axes=F)

然后您可以使用由生成的刻度位置生成轴新功能:

Then you may generate the axes, using the tick positions generated by the new function:

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()

作为第三种选择,当您在原始帖子中导入 ggplot2 时:相同,没有上述所有内容,使用 ggplot:

As a third option, as you are importing ggplot2 in your original post: The same, without all of the above, with 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()

这篇关于R 中的对数标度图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆