R 如何使用嵌套类别轴打印图表?
我正在绘制既有类别又有子类别的数据(请参见下面的示例数据),我希望将它们嵌套显示(此示例是在Excel中创建的):R 如何使用嵌套类别轴打印图表?,r,ggplot2,R,Ggplot2,我正在绘制既有类别又有子类别的数据(请参见下面的示例数据),我希望将它们嵌套显示(此示例是在Excel中创建的): 在R中,我想到的最好方法是使用所需的名称创建一个新列,如下所示: df <- data.frame(main.cat = c("A", "A", "B", "B", "B", "C"), second.cat = c("a1", "a2", "b1", "b2", "b3", "c1"), value =
在R中,我想到的最好方法是使用所需的名称创建一个新列,如下所示:
df <- data.frame(main.cat = c("A", "A", "B", "B", "B", "C"),
second.cat = c("a1", "a2", "b1", "b2", "b3", "c1"),
value = c(2, 3, 4, 2.5, 1.5, 2.3))
df$x.labels <- paste(df$second.cat, df$main.cat, sep = "\n")
ggplot(data = df, aes(x = x.labels, y = value)) + geom_point()
df未测试,但请尝试:
ggplot(data=df, aes(x=second.cat, y=value)) + geom_point() + facet_grid(~ main.cat, scales = 'free')
尽管如此,每个main.cat
的宽度都是相同的,并且标签只能放在顶部。我认为分面方法很好:
library(ggplot2)
library(gtable)
library(grid)
df <- data.frame(main.cat = c("A", "A", "B", "B", "B", "C"),
second.cat = c("a1", "a2", "b1", "b2", "b3", "c1"),
value = c(2, 3, 4, 2.5, 1.5, 2.3))
p = ggplot(data = df, aes(x = second.cat, y = value)) +
geom_point() + facet_grid(.~main.cat, space = "free_x", scales = "free_x") +
theme(strip.background = element_rect(fill = NA))
编辑概括的粗略尝试
library(ggplot2)
library(gtable)
library(grid)
df <- data.frame(main.cat = c("A", "A", "B", "B", "C", "D"),
second.cat = c("a1", "a2", "b1", "b2", "c1", "d1"),
value = c(2, 3, 4, 2.5, 1.5, 2.3))
p = ggplot(data = df, aes(x = second.cat, y = value)) +
geom_point() + facet_grid(.~main.cat, space = "free_x", scales = "free_x") +
theme(strip.background = element_rect(fill = NA))
p = p + theme(panel.spacing = unit(0, "lines"))
g = ggplotGrob(p)
gtable_show_layout(g) # to see the layout
# Get the indices for the panels (t=top, l=left, ...
panels <- c(subset(g$layout, grepl("panel", g$layout$name), se=t:r))
# Get the strip grob
stripGrob = gtable_filter(g, "strip")
# Its height is
height = stripGrob$height
# Add a row below the x-axis tick mark labels,
# the same height as the strip.
g = gtable_add_rows(g, height, unique(panels$b+1))
# Insert the strip grob into the new row
g = gtable_add_grob(g, stripGrob,
t = unique(panels$b+2),
l = min(panels$l),
r = max(panels$r))
# Insert line grobs as boundary lines between major categories
linesGrob = linesGrob(gp = gpar(col = "grey75"))
panelsR = panels$r[-length(panels$r)]
for(i in panelsR+1) g = gtable_add_grob(g, linesGrob,
t=unique(panels$b+1),
l=i,
b=unique(panels$b+2))
# Insert new columns of zero width to take the line grobs for the first and last boundary lines
panelBound = c(4, max(panels$r)+1)
for(i in panelBound) {
g = gtable_add_cols(g, unit(0, "lines"), i)
g = gtable_add_grob(g, linesGrob,
t=unique(panels$b+1),
l=i+1,
b=unique(panels$b+2))
}
# remove the old strip
g = g[-7, ]
# Draw it
grid.newpage()
grid.draw(g)
库(ggplot2)
图书馆(gtable)
图书馆(网格)
df刻面类工作,但最终每个刻面都会出现所有子分区(即,对于A部分,仍然有b1、b2、b3、c1;对于B部分,仍然有a1、a2、c1;等等)。有没有办法删除不需要的类别?使用参数scales='free'
到facet\u grid
(编辑答案)。第二个版本正是我想要的,谢谢。我不熟悉GTTable包,所以我显然有一些阅读要做,以了解如何将其推广到处理不同的类别集!Baptiste编写了一些关于gtable
函数的说明,可在
library(ggplot2)
library(gtable)
library(grid)
df <- data.frame(main.cat = c("A", "A", "B", "B", "C", "D"),
second.cat = c("a1", "a2", "b1", "b2", "c1", "d1"),
value = c(2, 3, 4, 2.5, 1.5, 2.3))
p = ggplot(data = df, aes(x = second.cat, y = value)) +
geom_point() + facet_grid(.~main.cat, space = "free_x", scales = "free_x") +
theme(strip.background = element_rect(fill = NA))
p = p + theme(panel.spacing = unit(0, "lines"))
g = ggplotGrob(p)
gtable_show_layout(g) # to see the layout
# Get the indices for the panels (t=top, l=left, ...
panels <- c(subset(g$layout, grepl("panel", g$layout$name), se=t:r))
# Get the strip grob
stripGrob = gtable_filter(g, "strip")
# Its height is
height = stripGrob$height
# Add a row below the x-axis tick mark labels,
# the same height as the strip.
g = gtable_add_rows(g, height, unique(panels$b+1))
# Insert the strip grob into the new row
g = gtable_add_grob(g, stripGrob,
t = unique(panels$b+2),
l = min(panels$l),
r = max(panels$r))
# Insert line grobs as boundary lines between major categories
linesGrob = linesGrob(gp = gpar(col = "grey75"))
panelsR = panels$r[-length(panels$r)]
for(i in panelsR+1) g = gtable_add_grob(g, linesGrob,
t=unique(panels$b+1),
l=i,
b=unique(panels$b+2))
# Insert new columns of zero width to take the line grobs for the first and last boundary lines
panelBound = c(4, max(panels$r)+1)
for(i in panelBound) {
g = gtable_add_cols(g, unit(0, "lines"), i)
g = gtable_add_grob(g, linesGrob,
t=unique(panels$b+1),
l=i+1,
b=unique(panels$b+2))
}
# remove the old strip
g = g[-7, ]
# Draw it
grid.newpage()
grid.draw(g)