避免直方图(格子)中的空刻度标签

Avoid empty tick labels in histogram (lattice)

我从 c​​sv 文件中读取数据:

| proband | stimulus | group | |---------|----------|-------| | 0 | A | X | | 0 | B | Y | | 0 | C | Z | | 1 | A | X | | 1 | B | Y | | 1 | C | N |

我正在读取 csv 文件并将每个刺激的直方图绘制为 pdf:

Data <- read.csv(file="./groups_data.csv", head=TRUE, sep=";")

library(lattice)
pdf("output/groups_single.pdf", width=8, height=4)
par(mar=c(1.5,0,1,2.5), xpd=TRUE)
bar_plot_single <- histogram(~ group | stimulus, data=Data, layout=c(1,1), xlab="Gruppe", ylab="Häufigkeit (%)", scales=list(x=list(rot=90)))
print(bar_plot_single)
dev.off()

当我使用格子为每个刺激绘制直方图时,我想避免空刻度标签(例如下图中的 N、Y、Z):

我认为它不适用于 lattice 的分面,但您可以这样手动循环:

library(lattice)

dat <- data.frame(proband = c(0, 0, 0, 1, 1, 1),
                  stimulus = c("A", "B", "C", "A", "B", "C"),
                  group = c("X", "Y", "Z", "X", "Y", "N"))

labels <- rbind("", levels(dat$group))

by(dat, dat$stimulus, function(x) {
  histogram(~ group, 
            data = x, 
            layout = c(1,1), 
            xlab = "Gruppe", 
            ylab = "Häufigkeit (%)", 
            ylim = c(-10, 110), 
            scales = list(x=list(rot=90,
                                 labels = labels[cbind(levels(x[, 3]) %in% x[, 3] + 1,
                                                 1:length(levels(x[, 3])))])),
            drop.unused.levels = FALSE) })

为每个绘图指定 x 轴刻度标签。

保存返回的列表对象然后

do.call(gridExtra::grid.arrange, c(p, nrow = 1))

给出如下图:

然后到 pdf 也与您的问题相同:

pdf("groups_single.pdf", width=8, height=4)
par(mar=c(1.5,0,1,2.5), xpd=TRUE)

by(dat, dat$stimulus, function(x) {
  histogram(~ group, 
            data = x, 
            layout = c(1,1), 
            xlab = "Gruppe", 
            ylab = "Häufigkeit (%)", 
            ylim = c(-10, 110), 
            scales = list(x=list(rot=90,
                                 labels = labels[cbind(levels(x[, 3]) %in% x[, 3] + 1,
                                                       1:length(levels(x[, 3])))])),
            drop.unused.levels = FALSE) })

dev.off()

我通过使用 for 循环设法得到了符合我需要的结果。

Data <- read.csv(file="./groups_data.csv", head=TRUE, sep=";")
stimuli <- factor(unique(Data$stimulus))


library(lattice)
pdf("output/groups_single.pdf", width=8, height=4)
par(mar=c(1.5,0,1,2.5), xpd=TRUE)
for ( i in stimuli ) {
    data <- subset(Data, stimulus == i)
    bar_plot_single <- histogram(~ group | stimulus, 
        data=data, 
        layout=c(1,1),
        ylim=c(0,100),
        xlab="Gruppe", 
        ylab="Häufigkeit (%)", 
        scales=list(x=list(rot=90)),
        panel=function(...){
            panel.abline(h=seq(0,150,20))
            panel.abline(v=seq(0,150,1))
            panel.histogram(...)
        })
    print(bar_plot_single)
}
dev.off()