绘制二进制系列的多个面板
Plot multiple panels of binary series
我在数据框中有以下形式的二进制事件数据:
year A B C D
1990 0 0 1 0
1991 0 1 1 0
1992 0 0 0 1
1993 1 1 0 0
总共可能有大约 50 个系列,大约 25 年。
我的目标是在一个图中显示所有系列,以可视化系列的聚合视图。
即我想在一个图中绘制所有数据,这样每一列都会有一个单独的面板相互叠加。每个面板都可以是一个简单的直方图(即 type="h"
)以可视化二进制数据。
除了 bottom-most 面板之外,彼此重叠的面板之间自然不应有 x-axis 标签和刻度等。
现在,我可以使用 par(mfrow=c(rows, cols))
手动执行此操作,然后分别对每个系列执行 plot(...)
,但由于要绘制图表的系列数量众多,这是不可行的。或者我可以写一个 for-loop 来处理它,但是必须有更好的方法来实现它。
如果不逐个面板手动操作,我怎么能做到这一点?如果有更好的方法在一个图中可视化所有系列的聚合视图,欢迎提出建议。例如,如果有一种方法可以在没有单独面板的情况下执行此操作。
Follow-up问题
关于格式化 Ben 的回答中的 ggplot2
解决方案:
1)目前,headers列(不知道确切名称,但"the series titles")在右侧,呈90°角,因此它们相互重叠,因为名称是国家名称。我希望它们以 0° 角位于每个面板的左侧。
2) 此外,目前每个面板都有自己的 y-axis 刻度标签 0 和 1,在每个面板的左侧,这些不是必需的,所以我想删除他们。
最简单的方法是将数据重塑为长格式(例如下面的 reshape2::melt()
),然后使用 lattice
或 ggplot2
.
dd <- read.table(header=TRUE,text="
year A B C D
1990 0 0 1 0
1991 0 1 1 0
1992 0 0 0 1
1993 1 1 0 0")
## make category names longer
names(dd) <- c("year","Aardvark","Behemoth","Cataclysm","Disaster")
library("reshape2")
ddm <- melt(dd,id.var="year")
格子
library("lattice")
## you could use type="h" here, but I like "b" better ...
xyplot(value~year|variable,data=ddm,type="b",
layout=c(1,4), ## stack (1 column, 4 rows); can also
## use a third element of layout to split
## into multiple pages
as.table=TRUE ## stack top-to-bottom
)
ggplot2
更新:移除y轴刻度标签;使用 this answer 旋转分面标签。
library("ggplot2"); theme_set(theme_bw())
ggplot(ddm,aes(year,value))+geom_point()+geom_line()+
facet_grid(variable~.)+ ## or use facet_wrap(~variable)
theme(panel.margin=grid::unit(0,"lines"))+ ## squash panels together
scale_y_continuous(breaks=c(0,1),labels=rep("",2))+
theme(strip.text.y = element_text(angle = 0))
我在数据框中有以下形式的二进制事件数据:
year A B C D
1990 0 0 1 0
1991 0 1 1 0
1992 0 0 0 1
1993 1 1 0 0
总共可能有大约 50 个系列,大约 25 年。
我的目标是在一个图中显示所有系列,以可视化系列的聚合视图。
即我想在一个图中绘制所有数据,这样每一列都会有一个单独的面板相互叠加。每个面板都可以是一个简单的直方图(即 type="h"
)以可视化二进制数据。
除了 bottom-most 面板之外,彼此重叠的面板之间自然不应有 x-axis 标签和刻度等。
现在,我可以使用 par(mfrow=c(rows, cols))
手动执行此操作,然后分别对每个系列执行 plot(...)
,但由于要绘制图表的系列数量众多,这是不可行的。或者我可以写一个 for-loop 来处理它,但是必须有更好的方法来实现它。
如果不逐个面板手动操作,我怎么能做到这一点?如果有更好的方法在一个图中可视化所有系列的聚合视图,欢迎提出建议。例如,如果有一种方法可以在没有单独面板的情况下执行此操作。
Follow-up问题
关于格式化 Ben 的回答中的 ggplot2
解决方案:
1)目前,headers列(不知道确切名称,但"the series titles")在右侧,呈90°角,因此它们相互重叠,因为名称是国家名称。我希望它们以 0° 角位于每个面板的左侧。
2) 此外,目前每个面板都有自己的 y-axis 刻度标签 0 和 1,在每个面板的左侧,这些不是必需的,所以我想删除他们。
最简单的方法是将数据重塑为长格式(例如下面的 reshape2::melt()
),然后使用 lattice
或 ggplot2
.
dd <- read.table(header=TRUE,text="
year A B C D
1990 0 0 1 0
1991 0 1 1 0
1992 0 0 0 1
1993 1 1 0 0")
## make category names longer
names(dd) <- c("year","Aardvark","Behemoth","Cataclysm","Disaster")
library("reshape2")
ddm <- melt(dd,id.var="year")
格子
library("lattice")
## you could use type="h" here, but I like "b" better ...
xyplot(value~year|variable,data=ddm,type="b",
layout=c(1,4), ## stack (1 column, 4 rows); can also
## use a third element of layout to split
## into multiple pages
as.table=TRUE ## stack top-to-bottom
)
ggplot2
更新:移除y轴刻度标签;使用 this answer 旋转分面标签。
library("ggplot2"); theme_set(theme_bw())
ggplot(ddm,aes(year,value))+geom_point()+geom_line()+
facet_grid(variable~.)+ ## or use facet_wrap(~variable)
theme(panel.margin=grid::unit(0,"lines"))+ ## squash panels together
scale_y_continuous(breaks=c(0,1),labels=rep("",2))+
theme(strip.text.y = element_text(angle = 0))