【问题标题】:ggplot2 - create a barplot for every column of a dataframeggplot2 - 为数据框的每一列创建一个条形图
【发布时间】:2019-03-20 05:48:12
【问题描述】:

我知道这个问题真的很基础,但我是一个初学者,我整天都在尝试为数据框的每一列绘制单独的图表。任何帮助都会非常有用

这是数据:

> dfslices
        X0035.A061 X0094.B116 X0314.A038
verylow   19.48052   8.127208 36.8243243
low        2.96846   9.069494  7.4324324
medium     0.00000   2.237927  0.3378378
high       0.00000   0.000000  1.6891892

基本上,我需要为每列(X0035.A061、X0094.B116 和 X0314.A038)绘制 1 个条形图。每个条形图有 4 个条形图(一个条形图对应于非常低的类别,另一个对应于低值,另一个对应于中等值,另一个对应于高值)。 图表的标题最好是(X0035.A061、X0094.B116 和 X0314.A038),并且图中的每个条形图都有相应的标签(非常低、低、中和高)

谢谢

【问题讨论】:

标签: r dataframe ggplot2 plot


【解决方案1】:

这是一种选择

library(purrr)
library(tibble) # rownames_to_column
library(ggplot2)
plots <- split.default(dfslices, names(dfslices)) %>% 
  map(., setNames, nm = "col") %>% 
  map(., rownames_to_column) %>%
  map(., mutate, rowname = factor(rowname, levels = c("verylow", "low", "medium", "high"))) %>% 
  imap(., ~ {
    ggplot(.x, aes(rowname, col)) + 
      geom_col() +
      labs(title = .y)
    })

plots$X0035.A061

这个想法是创建一个数据框列表,每个数据框都包含一列dfslices。我们使用split.default 创建该列表。

在接下来的两行中,我们将每个数据帧中的列重命名为“col”,并将每个数据帧的行名转换为显式列。下一步,将列rowname 转换为因子并相应地设置其水平。

终于可以使用imap 来迭代列表并遍历以.y 表示的列表的名称。我们使用.y 作为labs 的参数,使每个图的标题对应于(前)列名。

数据

dfslices <- structure(list(X0035.A061 = c(19.48052, 2.96846, 0, 0), X0094.B116 = c(8.127208, 
9.069494, 2.237927, 0), X0314.A038 = c(36.8243243, 7.4324324, 
0.3378378, 1.6891892)), .Names = c("X0035.A061", "X0094.B116", 
"X0314.A038"), class = "data.frame", row.names = c("verylow", 
"low", "medium", "high"))

【讨论】:

  • 投反对票的人,请考虑提供一些您认为可以改进答案的建议。
【解决方案2】:

这是解决问题的一种方法,将data.table 包用于melt()fread() 函数,并使用facet_grid() 来自ggplot2 将所有3 个原始列作为单独的面板绘制在一个单独的面板上情节。

library(data.table)
library(ggplot2)

# Convert text data to data.table using fread() from the data.table package.
dfslice = fread("category X0035.A061 X0094.B116 X0314.A038
                 verylow    19.48052   8.127208 36.8243243
                 low         2.96846   9.069494  7.4324324
                 medium      0.00000   2.237927  0.3378378
                 high        0.00000   0.000000  1.6891892")

# Convert data to 'long form' using melt() from the data.table package.
mtab = melt(dfslice, id.vars="category")

# Manually set factor levels of 'category' column to plot in a logical order.
mtab$category = factor(mtab$category, 
                       levels=c("verylow", "low", "medium", "high"))

mtab
#     category   variable      value
#  1:  verylow X0035.A061 19.4805200
#  2:      low X0035.A061  2.9684600
#  3:   medium X0035.A061  0.0000000
#  4:     high X0035.A061  0.0000000
#  5:  verylow X0094.B116  8.1272080
#  6:      low X0094.B116  9.0694940
#  7:   medium X0094.B116  2.2379270
#  8:     high X0094.B116  0.0000000
#  9:  verylow X0314.A038 36.8243243
# 10:      low X0314.A038  7.4324324
# 11:   medium X0314.A038  0.3378378
# 12:     high X0314.A038  1.6891892

p = ggplot(data=mtab, aes(x=category, y=value, fill=category)) +
    geom_bar(stat="identity") +
    scale_fill_viridis_d() +
    facet_grid(. ~ variable)

ggsave("faceted_barplot.png", plot=p, width=7.5, height=2.5, dpi=150)

【讨论】:

  • 我希望我能再次投票,我已经花了一个小时的大部分时间寻找一种方法来做到这一点!谢谢!
猜你喜欢
  • 2020-06-05
  • 2019-02-15
  • 1970-01-01
  • 2022-08-20
  • 2017-10-07
  • 2017-12-07
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多