Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:在ggplot2中将指南/图例的顺序从排序字符串更改为排序数字_R_String_Sorting_Ggplot2_Numeric - Fatal编程技术网

R:在ggplot2中将指南/图例的顺序从排序字符串更改为排序数字

R:在ggplot2中将指南/图例的顺序从排序字符串更改为排序数字,r,string,sorting,ggplot2,numeric,R,String,Sorting,Ggplot2,Numeric,我正在尝试使用ggplot2创建等值线图。我成功地使用cut()函数分组填充了geom_tile()函数的瓷砖。使用这种方法,中断将被解释为字符串,而不是值,这给我设置指南的顺序带来了麻烦。这样,例如,值20将被解释为大于180的数字,从而导致情节中出现致命的误导性颜色,例如故意丑恶的颜色: 为了创建这个丑陋的图像,我使用了以下代码: plot.isoline <- function(data, dbr=20, n_interp=200){ library(akima) lib

我正在尝试使用ggplot2创建等值线图。我成功地使用cut()函数分组填充了geom_tile()函数的瓷砖。使用这种方法,中断将被解释为字符串,而不是值,这给我设置指南的顺序带来了麻烦。这样,例如,值20将被解释为大于180的数字,从而导致情节中出现致命的误导性颜色,例如故意丑恶的颜色:

为了创建这个丑陋的图像,我使用了以下代码:

plot.isoline <- function(data, dbr=20, n_interp=200){

  library(akima)
  library(ggplot2)
  library(fields)

  data <- read.table(file = "http://s000.tinyupload.com/download.php?file_id=90687695741432763217&t=9068769574143276321730276", header = T)

  dint <- interp(x = data$x, y = data$y, z = data$z,
                 xo = seq(min(data$x), max(data$x), length = n_interp),
                 yo = seq(min(data$y), max(data$y), length = n_interp))

  dat_interp <- data.frame(expand.grid(x=dint$x,y=dint$y), z=c(dint$z))

  br <- seq(floor(min(dat_interp$z)/dbr)*dbr, ceiling(max(dat_interp$z)/dbr)*dbr, dbr)

  breaks <- cut(dat_interp$z, breaks = br)
  breaks <- gsub(","," - ",breaks,fixed=TRUE)

  dat_interp$breaks <- sapply(breaks, function(x){strsplit(x, "[( ]")[[1]][[2]]})

  ret <- ggplot(dat_interp) + 
    aes(x=x, y=y, z=z) +
    geom_tile(aes(fill=breaks)) +
    scale_fill_manual("TEMP", values=tim.colors(length(br)), guide = guide_legend(reverse=TRUE)) +
    stat_contour(breaks=br) +
    scale_x_continuous(expand=c(0,0)) +
    scale_y_continuous(expand=c(0,0))

  return(ret)        
}

plot.isoline
ggplot2
字符
值作为字符串排序,并将
因子
值按其级别排序。在代码中

breaks <- gsub(","," - ",breaks,fixed=TRUE)

在@krlmlr的帮助下,我成功地解决了这个问题。正如他所说,关键的部分是编辑标高()。对于任何感兴趣的人来说,这是重要的部分:

  breaks <- cut(dat_interp$z, breaks = br)
  levels(breaks) <- gsub(","," - ", levels(breaks),fixed=TRUE)
  dat_interp$breaks <- breaks
  levels(dat_interp$breaks) <- as.numeric(sapply(levels(breaks), function(x){strsplit(x, "[( ]")[[1]][[2]]}))

中断,但在使用
dat_interp$breaks@oepix之后:哦,我错过了那一行。尝试在
dat_interp
数据框中使用
cut
返回的中断,并仅在必要时修改级别。(我认为
strsplit
也可以使用
gsub
实现。)好的,这帮我弄明白了,非常感谢@krlmlr!
levels(breaks) <- gsub(",", " - ", levels(breaks), fixed=TRUE)
  breaks <- cut(dat_interp$z, breaks = br)
  levels(breaks) <- gsub(","," - ", levels(breaks),fixed=TRUE)
  dat_interp$breaks <- breaks
  levels(dat_interp$breaks) <- as.numeric(sapply(levels(breaks), function(x){strsplit(x, "[( ]")[[1]][[2]]}))
plot.isoline <- function(data, dbr=20, n_interp=200){

  library(akima)
  library(ggplot2)
  library(fields)

  data <- read.table(file = "http://s000.tinyupload.com/download.php?file_id=90687695741432763217&t=9068769574143276321730276", header = T)

  dint <- interp(x = data$x, y = data$y, z = data$z,
                 xo = seq(min(data$x), max(data$x), length = n_interp),
                 yo = seq(min(data$y), max(data$y), length = n_interp))

  dat_interp <- data.frame(expand.grid(x=dint$x,y=dint$y), z=c(dint$z))

  br <- seq(floor(min(dat_interp$z)/dbr)*dbr, ceiling(max(dat_interp$z)/dbr)*dbr, dbr)

  breaks <- cut(dat_interp$z, breaks = br)
  levels(breaks) <- gsub(","," - ", levels(breaks),fixed=TRUE)
  dat_interp$breaks <- breaks
  levels(dat_interp$breaks) <- as.numeric(sapply(levels(breaks), function(x){strsplit(x, "[( ]")[[1]][[2]]}))

  ret <- ggplot(dat_interp) + 
    aes(x=x, y=y, z=z) +
    geom_tile(aes(fill=breaks)) +
    scale_fill_manual("TEMP", values=tim.colors(length(br)), guide = guide_legend(reverse=TRUE)) +
    stat_contour(breaks=br) +
    scale_x_continuous(expand=c(0,0)) +
    scale_y_continuous(expand=c(0,0))

  return(ret)        
}