ggplot2-为数据框的每一列创建一个barplot

时间:2018-10-15 18:36:32

标签: r dataframe ggplot2 plot

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

以下是数据:

> 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)都需要一个barplot。每个条形图都有4条(一条对应于非常低的类别,另一条对应于低,另一条对应于中,另一条对应于高)。 图表的标题是(X0035.A061,X0094.B116和X0314.A038),并且图表的每个小节都有相应的标签(非常低,低,中和高),这会很好。

谢谢

2 个答案:

答案 0 :(得分:5)

以下是使用data.tablemelt()函数的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)

enter image description here

答案 1 :(得分:3)

这是一个选择

suspend fun uploadFile(path: Path) {
    ...
    val asyncFile: AsyncFile = awaitResult { fs.open(path.toString(), OpenOptions(), it) }
    val methodType: HttpMethod = when (link.method.toLowerCase()) {
        "put" -> HttpMethod.PUT
        "post" -> HttpMethod.POST
        else -> throw UnsupportedOperationException("Method is not supported")
    }
    val request: HttpRequest<Buffer> = webClient.requestAbs(methodType, link.href)
    val response: HttpResponse<Buffer> = awaitResult { request.sendStream(asyncFile, it) }
}

enter image description here

这个想法是创建一个数据帧列表,每个数据帧包含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创建该列表。

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

最后可以使用rowname遍历列表,并遍历列表中由imap表示的名称。我们使用.y作为.y的参数,以使每个图的标题与(以前的)列名相对应。

数据

labs