簡體   English   中英

directlabels:在同一圖中為不同的面板使用不同的定位方法

[英]directlabels: using different positioning methods for different panels in the same plot

我有一個雙面板格子線圖。 我想使用directlabels包自動標記每個圖中的線條。 但我想為每個情節使用不同的定位方法。 具體而言,我想使用first.bumpup對於第一面板的方法,並且last.bumpup對於所述第二面板的方法。 這是一個最小的例子:

library(directlabels)
library(lattice)
myDF <- data.frame(
  y     = rep(1:4,         2),
  x     = rep(rep(1:2, 2), 2),
  group = rep(c('a', 'b'), each = 2),
  panel = rep(1:2,         each = 4))
myPlot <- xyplot(y ~ x | panel, groups = group, data = myDF, type = 'l')
direct.label(
  p      = myPlot,
  method = 'first.bumpup')

此代碼生成一個圖表,其中標簽顯示在每個面板的左側:

由示例代碼生成的圖

我想在左側面板的左側(如本例所示)標簽,但在右側面板的右側。 制作這種形象的最簡單方法是什么?

我已經檢查了directlabels文檔中高級示例 ,它們讓我認為通過創建自定義定位方法或自定義面板可以為不同的面板使用不同的方法。 但我不太明白該怎么做。

我用ggplot2對此進行了一次破解(僅僅因為我知道ggplot2比我知道lattice好得多)。 讓我知道你的想法。 以下是兩種方法。 第一個實際上不使用directlabels 放置規則相對簡單,所以我只使用geom_text進行標簽放置。 第二種方法確實使用directlabels ,但更復雜。

使用geom_text放置標簽

library(dplyr)   # For chaining operator (%>%)
library(ggplot2)
library(cowplot) # For cowplot theme

ggplot(myDF, aes(x, y, colour=group)) + 
  geom_line() +
  geom_text(data=myDF %>% group_by(panel) %>%
              filter(ifelse(panel==1, x==min(x), x==max(x))),
            aes(x + 0.07*(panel-mean(panel)), y, label=group)) +
  facet_grid(~panel) +
  scale_x_continuous(breaks=seq(1,2,0.2)) +
  theme_cowplot() +
  guides(colour=FALSE)

在上面的代碼中,在geom_text我們只保留第一個面板的最低x值和第二個面板中的最高x值,然后將group標簽放在與y值配對的x值上。 x + 0.07*(panel-mean(panel))只是將標簽稍微遠離線的末端移動。

在此輸入圖像描述

使用mapplydirectlabels放置標簽

這是使用directlabels的更復雜的方法。 我的方法是使用mapply分別繪制每個“facet”,這樣我就可以為每個面板使用不同的directlabels方法,但是然后將兩個繪圖放在一起就好像它們是同一整體圖的兩個面。 如果你喜歡這個結果,如果沒有ggplot2版本符合你的需要,也許你可以將它調整到lattice圖。

library(directlabels)
library(ggplot2)
library(gridExtra)
library(cowplot)

pl = mapply(function(pnl, m) {

  # Create plot for each level of panel
  p = ggplot(myDF[myDF$panel==pnl, ], aes(x, y, colour=group)) + 
    geom_line() +
    facet_grid(~panel) +
    scale_x_continuous(breaks=seq(1,2,0.2)) +
    theme_cowplot()

  # # Tweak margins of panel 1
  # if(pnl==1) p = p + theme(plot.margin=unit(rep(0,4),"lines"))

  # Remove y-axis title, labels and ticks for panel 2 and tweak margins
  if(pnl==2) p = p + theme(axis.title.y=element_blank(), 
                           axis.text.y=element_blank(),
                           axis.ticks.y=element_blank())

  # Add directlabels with different method for each panel
  direct.label(p, method=m)
  }, 
  pnl=unique(myDF$panel), m=c("first.bumpup", "last.bumpup"), SIMPLIFY=FALSE)

因為我刪除了面板2中的y軸標題,標簽和刻度,所以該面板比面板1 plot_grid有一個align參數,允許我們對齊這兩個圖,使它們具有相同的寬度,但我不知道知道如何擺脫地塊之間的空間。 grid.arrange也將列出該圖,但我們必須手動調整寬度(您也可以使用plot_grid手動調整寬度)。

# Lay out each panel using plot_grid from cowplot package
plot_grid(plotlist=pl, ncol=2, align="v")

在此輸入圖像描述

# Lay out each panel using grid.arrange from gridExtra package
grid.arrange(grobs=pl, ncol=2, widths=c(10,9))

在此輸入圖像描述

以下是eipi10的第二種解決方案,它在格子圖中創建了所需的效果:

library(directlabels)
library(gridExtra)
library(lattice)

myDF <- data.frame(
  y     = rep(1:4,         2),
  x     = rep(rep(1:2, 2), 2),
  group = rep(c('a', 'b'), each = 2),
  panel = rep(1:2,         each = 4))

plotFunction <- function(panelNumber, labelMethod) {
  myPlot = xyplot(
    y ~ x, 
    groups = group, 
    data   = myDF[myDF$panel==panelNumber, ], 
    type   = 'l')
  direct.label(
    p      = myPlot,
    method = labelMethod)  
} 

panelList = mapply(
  FUN         = plotFunction, 
  panelNumber = unique(myDF$panel), 
  labelMethod = c('first.bumpup', 'last.bumpup'), 
  SIMPLIFY    = FALSE)

grid.arrange(grobs = panelList, ncol = 2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM