2015-11-07 112 views
2

我想在海洋学中制作我们需要的特定数字。不幸的是,双重,三重或更多的轴在R中并不是很好的实现。我不需要双倍的y轴,因为在双倍的晶格额外的情况下。我需要双轴或三轴x轴。我无法找到一种方法来使用双倍的比例来获得我的优势。也许这是可能的。帮助将不胜感激。双x轴(类似于双倍的厚度)与晶格额外或类似

这是我现在已经基于数据:

stackoverflow_fluo.csv:http://pastebin.com/embed_js.php?i=7KNEiytF

animals_stackoverflow.csv:http://pastebin.com/embed_js.php?i=CnEJaq6b

重要更新:我忘了提,深度值在两个数据集的y轴上是不同的间距。

library(latticeExtra) 
#dataset 1 

    data1011 <- file.path('stackoverflow_fluo.csv') 
    jdatax1 = read.csv(data1011) 
    jdatax1$stat<-as.factor(jdatax1$Station) 

    #dataset2 

    data1012 <- file.path('animals_stackoverflow.csv') 
    jdatax2 = read.csv(data1012) 
    jdatax2$stat<-as.factor(jdatax2$stat) 

    #attempt multi axes 

    animals<-barchart(depth_good ~Mass | stat, data = jdatax2) 
    fluo<-xyplot(depth~chl | stat, data = jdatax1, type = "l") 
    doubleYScale(animals, fluo) 

    #plot 
    jpeg("double_y", width = 11, height = 8.5, units = 'in', res = 300) 
    doubleYScale(animals, fluo) 
    dev.off() 

enter image description here

我需要的是完全一样的,除了粉红色的数据(萤光灯)需要它自己的轴。条形图必须是这样的,但实际上我想让y轴反转,使0位于顶部。实际的数据也有更多的站点,所以它会像8个数据面板。

期待看到这可以做什么! 非常感谢!编号: 新增的例子。见这里:

enter image description here PS。我并不是说我想要一些看起来像这样的东西 - 或者轴数太多。但是两个x将会很好.-

+1

您是否可以包含指向您要查找的类型图的链接? (我会特别感兴趣的是看到一个三轴x轴。) –

+0

非常感谢。好点子。我添加了一个例子。往上看! –

回答

2

据我所知,这里没有预先包装的解决方案来解决更一般的问题。

下面的示例介绍了几种添加附加轴的方法。第二种和更一般的方法(即使在沿着绘图边界添加轴时我倾向于使用该方法)通过首先推动视口并沿着其边缘添加轴来工作。通过将视口推入一英寸高度(例如),它可以让您生成一个在图上浮动一英寸的轴。使用提供的参数xlim=参数推送视口还允许您设置其本地坐标系,该坐标系允许您避开一些其他需要的坐标系转换。

下面这些中等评论的代码还有很多,我会让你自己去探索一下!

library(lattice) 
library(grid) 

## Functions for converting units between axes 
year2salinity <- function(year) {33 + (1/30)*(year-1900)} 
salinity2year <- function(salinity) 1900 + 30*(salinity-33) 
year2copepod <- function(year) {1000 + 100*(year-1900)} 

## A better pretty(). (base::pretty() will often return limits that 
## run beyond plot's ends.) 
prettyBetween <- function(x,...) { 
    xx <- pretty(x,...) 
    xx[xx >= min(x) & xx <= max(x)] 
} 

## Custom axis-drawing function to be invoked via xyplot(..., axis=customAxis) 
customAxis <- function(side, ...) { 
    if (side == "top") { 
     xlim <- current.panel.limits()$xlim 
     ## Method #1 (Only works for axis along side of plot) 
     atSalinity <- prettyBetween(year2salinity(xlim)) 
     panel.axis(side = side, outside = TRUE, at=salinity2year(atSalinity), 
        labels = as.character(atSalinity), 
        rot=0) 
     grid.text("Salinity", gp=gpar(cex=0.9), 
        y=unit(1, "npc") + unit(2.5, "lines")) 
     ## Method #2 (Works for "floating" axis or -- with viewport height=0 -- 
     ##   for axis along side of plot.) 
     atCopepod <- prettyBetween(year2copepod(xlim)) 
     pushViewport(viewport(height = unit(4, "lines"), 
           y = 1, just = "bottom", 
           xscale = year2copepod(xlim))) 
     panel.axis(side = side, outside = TRUE, at=atCopepod, 
        labels = as.character(atCopepod), 
        line.col = "grey65", text.col = "grey35", rot=0) 
     ## panel.axis doesn't draw the axis' "baseline", so we do it using grid.axis 
     grid.xaxis(at = atCopepod, label = FALSE, 
        main = FALSE, gp = gpar(col="grey65")) 
     grid.text(expression("Copepods m"^{-3}), gp=gpar(cex=0.9, col="grey35"), 
        y=unit(1, "npc") + unit(2.5, "lines")) 
     popViewport() 
    } 
    else { 
     axis.default(side = side, ...) 
    } 
} 

xyplot(nhtemp ~ time(nhtemp), aspect = "xy", type = "o", 
     xlab = "Year", ylab = "Temperature", 
     axis = customAxis, 
     main = "Yearly temperature, salinity, and copepod abundance", 
     scales = list(x=list(alternating=3)), 
     ## Set up key.axis.padding (an element of each lattice plot's layout) to 
     ## understand values in terms of lines... 
     lattice.options=list(layout.heights=list(key.axis.padding=list(x=1,units="lines"))), 
     ## ... so that you can tell it you need 6 "lines" of space for axes 
     par.settings = list(layout.heights=list(key.axis.padding=6))) 

enter image description here


补充说明,主要是为我自己:

上面的代码需要既panel.axis()grid.xaxis()调用,这是不甚理想。我们需要调用grid.xaxis()(并且就此而言定义函数prettyBetween())的唯一原因是panel.axis()绘制刻度线和标签,但不绘制轴基线。如果panel.axis()有选择这样做,这里的事情会更简单。要了解这将是一样,运行trace()到一些额外的基线绘制代码附加到每个panel.axis()电话...

trace(panel.axis, 
     exit=expression(
     grid.lines(x = unit(at[c(1,length(at))], "native"), 
        y = unit(c(1,1), "npc"), 
        gp = gp.line))) 

....之后调用面板轴(带side=="top")将绘制我们想要的基线。

+0

谢谢! –