【问题标题】:Plotting aligned histograms in the same graph在同一图中绘制对齐的直方图
【发布时间】:2016-10-16 07:03:22
【问题描述】:

我需要根据矩阵的行在同一张图中绘制对齐的直方图。在以下示例中,我需要绘制 5 个堆叠直方图。然而, hist 命令绘制整个矩阵的一个直方图。有什么我可以使用的解决方法吗?

提前致谢。

阿图罗

x <- 10; y <- 10; g <- 5
dat <- matrix(rnorm((x + y) * g), ncol = x + y)
hist (dat)

【问题讨论】:

  • 所以您希望每行都有单独的条形图,并且您希望它们垂直堆叠以进行比较?
  • 没错。每行应该有自己的 y 轴和共享的 x 轴。

标签: r


【解决方案1】:

ggplot 轻松搞定(需要长格式数据)。

library(tidyr); library(dplyr); library(ggplot2)

df <- dat %>% t() %>% as.data.frame() %>% gather(row)  # chage data into a long format
Breaks <- hist(dat, plot=F)$breaks                     # get (or decide) breaks

ggplot(df, aes(x = value, fill = row)) + geom_histogram(position = "stack", breaks = Breaks)

[已编辑]
这是你想要的吗?

  ## original
ggplot(df, aes(x = value)) + 
  geom_histogram(breaks = Breaks) +
  facet_wrap(~ row)            # make histogram par group.

  ## modified
ggplot(df, aes(x = value, fill = row)) +                 # change fill colour
  geom_histogram(breaks = Breaks) +
  facet_wrap(~ row, ncol = 1) +                          # bring graphs into line
   #  facet_wrap( ~ row, ncol = 1, scales = "free_y")    # if you don't want fixed scale
  theme(strip.background = element_blank(), strip.text.x = element_blank()) # delete labels

[EDITED2:base_plot 方法]
基图节省时间。

 ## example data
x <- 1500; y <- 1500; g <- 30
set.seed(1); dat <- matrix(rnorm((x + y) * g), ncol = x + y)

 ## decide breaks
Breaks <- seq(-4.5, 4.5, 0.5)

 ## change par() to draw multiple graphs
par.old <- par(mar = c(0.1, 4.0, 0.1, 0.5), oma = c(4, 0, 0, 0), mfrow = c(nrow(dat), 1))

for(i in 1:nrow(dat)) {
  hist(dat[,i], breaks = Breaks, xaxt = "n", xlab = "", main = "")
#  grid(NULL)
    }
par(new=T)
hist(dat[,nrow(dat)], breaks = Breaks, main = "", yaxt = "n", 
     xlab = "x", ylab = "", border = NA)          # add x-axis

par(par.old)

【讨论】:

  • 谢谢,但我需要将绘图中的每一行分开,以便立即看到它的贡献
  • 谢谢。这接近我想要的。现在我需要理解代码.. :-)
  • 也感谢注释代码。我还有一个问题,如果你不介意的话。有时,我需要绘制最大为 30x6000 的数组,而不是 5x20,就像我提供的示例中一样。我注意到在这种情况下,该过程需要很长时间。我在想可能是去除颜色可以加快速度。你认为这可行吗?
  • @Arturo;不幸的是,就我对环境的体验而言,颜色对时间的影响不大。当然,您可以通过删除fill = row 来移除hist 的颜色,并通过在theme(strip...) 之前插入其他ggtheme 来更改主题,例如... + facet_wrap(~ row, ncol = 1) + theme_minimal() + theme(strip.background = element_blank(), strip.text.x = element_blank())(参见ggtheme)。我没有节省时间的好主意。
  • @Arturo;我添加了另一种方法。
【解决方案2】:

这是我用来在同一个图表中生成两个直方图的方法。

考虑有一个数据集,其中 x 列是连续变量,y 列是因子变量;每个级别将产生一个直方图。请在下面找到使用 ggplot2 的代码示例:

OverlayedHist <- function(mData       ,
                          featureVar  ,
                          grouper     ,
                          mbinwidth   ,
                          mTitle      ,
                          mxlab       ,
                          mylab       ,
                          mlegendTitle
){

  # function name: OverlayedHist
  #       purpose: To produce overlayed histograms against a grouping variable
  #         Input: 
  #         mData: dataset object in data.table format
  #    featureVar: name of continuous variable to produce histogram
  #       grouper: the grouping variable to produce the histogram 
  #     mbinwidth: binwidth (see ggplot2 parameters)
  #        mTitle: Character to define title
  #         mxlab: Character to define xlab name
  #         mylab: Character to define ylab name
  #  mlegendTitle: Character to define legend title

  library(data.table)
  library(ggplot2)
  library(plotly)

  p <- ggplot(allDat, aes(eval(parse(text = featureVar)), fill = eval(parse(text = grouper)))) +
    geom_histogram(alpha = 0.7, position = 'identity', binwidth = mbinwidth) + 
    scale_fill_manual(values=c("#377EB8","#E41A1C")) + 
    ggtitle(mTitle) +
    xlab(mxlab) + ylab(mylab) + 
    guides(fill=guide_legend(title=mlegendTitle)) + theme(plot.title = element_text(size=10))


  return(ggplotly(p))

}

我希望这会有所帮助。

干杯! K.

【讨论】:

  • 能否请您发布一些工作代码来测试您的方法?
  • 以上可以找到更详细的交互式情节版本
猜你喜欢
  • 1970-01-01
  • 2017-03-31
  • 2020-06-19
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多