[英]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))
只是將標簽稍微遠離線的末端移動。
mapply
和directlabels
放置標簽 這是使用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.