【问题标题】:ggplot: y-axis (breaks) values from stacked proportional bar graph?ggplot:堆叠比例条形图中的y轴(中断)值?
【发布时间】:2013-02-06 12:23:42
【问题描述】:

问题解决了!感谢大家! (本文底部的解决方案)

我喜欢用 ggplot 创建一个堆叠的比例条形图。我的问题是 y 轴的中断,这似乎与每个条形图块的百分比值有关,但不像预期的那样介于 0 到 100 之间。

这是我的数据框:

   fg grp  prc
1   1  g1 85.23
2   2  g1 14.77
3   1  g2 73.33
4   2  g2 26.67
5   1  g3 85.53
6   2  g3 14.47
7   1  g4 87.18
8   2  g4 12.82
9   1  g5 72.22
10  2  g5 27.78

这就是我调用绘图函数的方式:

require(ggplot2)
ggplot(mydat, aes(x=grp, y=prc, fill=fg)) +
  geom_bar(stat="identity", colour="black", show_guide=FALSE) +
  scale_fill_manual(values=c("#235a80", "#80acc8")) +
  labs(title=NULL, x="Cluster-Gruppen", y=NULL) +
  theme(axis.line = element_line(colour="gray"), 
      axis.text = element_text(size=rel(1.3)), 
      axis.title = element_text(face="italic", size=rel(1.4)))

最后,这是我的结果:

如您所见,y 轴中断对应于 prc 变量的百分比值。

我希望 y 轴范围从 0 到 100,每隔 10 个位置中断一次 (seq(0,100,by=10))。我需要以任何方式准备我的数据吗?我如何设法“修复” y 轴?

提前致谢

这就是我计算数据和工作解决方案的方式!

clusterDiskriminanz <- function(myData, groups, gcnt) {
  disc <- lda(groups ~ ., data=myData, na.action="na.omit", CV=TRUE)
  ct <- table(groups, disc$class)
  dg <- diag(prop.table(ct, 1))
  # print barplot for correct percentage for each category of groups

  newdat <- NULL
  tmpdat <- NULL
  filldat <- NULL

  perc <- round(100*dg,2)
  percrest <-  round(100-perc,2)

  # looks strange, but for testing purposes
  # I add data this way. Perhaps I also lack
  # a bit of functions which may do this better and faster
  for (i in 1:gcnt) {
    newdat <- rbind(newdat, c(paste("g",i,sep="")))
    newdat <- rbind(newdat, c(paste("g",i,sep="")))
    tmpdat <- rbind(tmpdat, perc[i])
    tmpdat <- rbind(tmpdat, percrest[i])
    filldat <- rbind(filldat, "1")
    filldat <- rbind(filldat, "2")
  }

  # create data frame! prc-values are treated as numeric
  # now! need to convert $g to factors though!
  mydat <- data.frame(filldat, newdat, tmpdat)
  names(mydat) <- c("fg", "grp", "prc")
  mydat$fg <- factor(mydat$fg)

  # ggplot-stuff comes here...
  require(ggplot2)
  ggplot(mydat, aes(x=grp, y=prc, fill=fg)) +
    geom_bar(stat="identity", colour="black", show_guide=FALSE) +
    scale_fill_manual(values=c("#235a80", "#80acc8")) +
    labs(title=NULL, x="Cluster-Gruppen", y=NULL) +
    geom_hline(yintercept=totalcorrect, linetype=2, colour="white", alpha=0.8) +
    # Achsenbeschriftung etwas größer machen
    theme(axis.line = element_line(colour="gray"), 
          axis.text = element_text(size=rel(1.3)), 
          axis.title = element_text(face="italic", size=rel(1.4))) + 
    scale_y_continuous(breaks = seq(0, 100, 10)) +
    coord_cartesian(ylim=c(0,100))
  }

【问题讨论】:

  • 我认为变量 prc 被视为因子(只有这样我才能得到与你相同的 y 比例)。尝试 str(mydat) 查看所有列的类型。我建议从您的功能行中删除 newdat
  • 非常感谢,我知道了! str-command 帮助向我展示了缺失的信息。实际上,$prc 被视为因子,并且只需使用 mydat

标签: r ggplot2 bar-chart


【解决方案1】:

您可以使用scale_y_continuous 函数(参数breaks)指定中断:

mydat <- as.data.frame(mydat)
mydat$fg <- as.factor(mydat$fg)

library(ggplot2)
ggplot(mydat, aes(x=grp, y=prc, fill=fg)) +
  geom_bar(stat="identity", colour="black", show_guide=FALSE) +
  scale_fill_manual(values=c("#235a80", "#80acc8")) +
  labs(title=NULL, x="Cluster-Gruppen", y=NULL) +
  theme(axis.line = element_line(colour="gray"), 
        axis.text = element_text(size=rel(1.3)), 
        axis.title = element_text(face="italic", size=rel(1.4))) +
  scale_y_continuous(breaks = seq(0, 100, 10))         # the new command

【讨论】:

  • 嗨,斯文,感谢您的快速答复!单独添加 scale-command 不起作用,我已经尝试过了。它会导致错误:“提供给连续刻度的离散值”。但是按照 JT85 的建议“转换”数据似乎可以解决问题,然后 scale 命令工作正常!但仅当我使用 textConnection 命令时,如果我将附加命令应用于我的原始数据框,则不会。
  • @DanielLüdecke 是的,我使用mydat$fg &lt;- as.factor(mydat$fg)fg 转换为因子。如果没有这种转换,我会收到相同的错误消息。
【解决方案2】:

您可以使用coord_cartesian(ylim=c(0,100)) 指定limits 来执行数据的可视缩放(然后保持不变)。您也可以将其添加到 scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10))),但在比例上设置限制将仅使用这些限制内的数据,因此是原始数据的子集。在您的示例中,它将返回相同的图,但它可以大幅更改图(例如箱线图)。

dataset<- textConnection("fg grp  prc
1  g1 85.23
2  g1 14.77
1  g2 73.33
2  g2 26.67
1  g3 85.53
2  g3 14.47
1  g4 87.18
2  g4 12.82
1  g5 72.22
2  g5 27.78")

mydat<- read.table(dataset,header=TRUE) 
mydat$fg <- as.factor(mydat$fg)

ggplot(mydat, aes(x=grp, y=prc, fill=fg)) +
geom_bar(stat="identity", colour="black", show_guide=FALSE) +
scale_fill_manual(values=c("#235a80", "#80acc8")) +
labs(title=NULL, x="Cluster-Gruppen", y=NULL) +
theme(axis.line = element_line(colour="gray"), 
axis.text = element_text(size=rel(1.3)), 
axis.title = element_text(face="italic", size=rel(1.4))) + coord_cartesian(ylim=c(0,100))+ scale_y_continuous(breaks=(seq(0,100,by=10))) 

编辑由于评论:

这不起作用:

ggplot(mydat, aes(x=grp, y=prc, fill=fg)) +
geom_bar(stat="identity", colour="black", show_guide=FALSE) +
scale_fill_manual(values=c("#235a80", "#80acc8")) +
labs(title=NULL, x="Cluster-Gruppen", y=NULL) +
theme(axis.line = element_line(colour="gray"), 
    axis.text = element_text(size=rel(1.3)), 
    axis.title = element_text(face="italic", size=rel(1.4)))+scale_y_continuous(breaks = seq(0, 100, 10))
+coord_cartesian(ylim=c(0,100))

这样做:

ggplot(mydat, aes(x=grp, y=prc, fill=fg)) +
geom_bar(stat="identity", colour="black", show_guide=FALSE) +
scale_fill_manual(values=c("#235a80", "#80acc8")) +
labs(title=NULL, x="Cluster-Gruppen", y=NULL) +
theme(axis.line = element_line(colour="gray"), 
    axis.text = element_text(size=rel(1.3)), 
    axis.title = element_text(face="italic", size=rel(1.4)))+scale_y_continuous(breaks = seq(0, 100, 10)) +
coord_cartesian(ylim=c(0,100))

【讨论】:

  • 谢谢!这种方法部分有效 - 但前提是我使用 textConnection 函数读取数据。我的原始数据框有什么不同?我的数据框中的值的格式或编码是否错误?在我的数据框上运行代码会导致:“Fehler in +coord_cartesian(ylim = c(0, 100)) : ungültiges Argument für unären Operator”。但是,当我使用由 textConnection/read.table 创建的数据框时,它可以工作。
  • 你必须以正确的方式添加 +coord_cartesian(ylim = c(0, 100)) 。您的代码中的“+”号在哪里?在上一行的末尾还是在下一行的开头?
  • 如果我只添加坐标参数,会产生以下结果:temp.danielluedecke.de/Rplot2.png
  • 但如果我还添加了 scale-command,则会再次出现错误(离散值到 cont. scale)。请参阅我的原始帖子,我编辑了创建数据框的方式,如果这有帮助?
  • 再次检查您的代码。当我添加 +coord_cartesian(ylim = c(0, 1000)) 时,我得到的情节几乎和你一样
最近更新 更多