【问题标题】:R Markdown automated plots loopR Markdown 自动绘图循环
【发布时间】:2026-01-12 01:25:01
【问题描述】:

我正在尝试处理自动循环以在 R 中创建绘图,但我是初学者,我真的很努力。

假设我有一个这样的数据框:

lp     date     cars       laptops
1   2016-10-01  bmw         lenovo
2   2016-10-02  mercedes    dell
3   2016-10-03  mercedes    dell
4   2017-11-04  null        acer
5   2017-11-05  seat        asus
6   2017-11-06  seat        asus
7   2018-12-07  bmw         null
8   2018-12-08  volvo       asus
9   2018-12-09  volvo       dell
10  2018-12-10  null        lenovo

然后我使用这个代码:

df %>% mutate(date = year(date)) %>% group_by(date, cars) %>% count() -> df_mutated

所以我得到类似的东西:

date    cars        n
2016    bmw         1
2016    mercedes    2
2017    null        1
2017    seat        2
2018    bmw         1
2018    volvo       2
2018    null        1

之后我使用一些函数来创建两种类型的图

#gg plot function #
function.name <- function(df_mutated)
{
  require(ggplot2)
  p <- ggplot(df_mutated, aes(x = date, y=n))
  p + geom_bar(stat = "identity",aes(fill = cars))
}
#use of function#
plot_cars <- function.name(df_mutated)

#ggplot with 100% percentage#
function.name2 <- function(df_mutated)
{
  require(ggplot2)
  p <- ggplot(df_mutated, aes(x = date, y=n))
  p + geom_bar(stat = "identity",position = "fill",aes(fill = cars))+scale_y_continuous(labels = percent_format())
}
#use of percentage function#
plot_cars_percentage <- function.name2(df_mutated)

在上面的示例中,我为“日期”和一个分类变量 =“汽车”创建了两个不同的图。我想自动化这个过程,所以我可以为我将在我的数据集中拥有的每个分类变量创建这两个图,所以在这种情况下它将是汽车和笔记本电脑。当然,以一种不需要手动编写变量名的方式。所以最后我当然会有更多的图,因为每个分类变量会有 2 个图。

如果有任何帮助,我将不胜感激。 谢谢!

【问题讨论】:

  • 也许可以使用facet_wrap 代替循环?简化一切...尝试添加此+ facet_wrap(~ laptops)
  • 也许我解释得不够好。我希望函数自动获取变量,所以我不必命名它们。
  • 重做你的例子,因为不清楚你在问什么。为什么要包括百分比图?从您的评论看来,您想循环访问不同的变量以用于图中的 y 变量,因此请基于此创建一个示例。
  • 在示例中,我使用一个“y”变量来创建我需要的两种类型的图。这是我得到的所有代码,所以我已经粘贴了它。现在我想使用这些函数(或者不,我不知道,也许它们不适合)为我将在我的数据框中拥有的每个分类“y”变量创建这两种类型的图,所以在上面的例子中是汽车和笔记本电脑。
  • 所以您想以编程方式定义用于y 的变量:ggplot2.tidyverse.org/reference/aes_.html

标签: r loops ggplot2


【解决方案1】:

只需使用aes_string,如下:

library(dplyr)
library(ggplot2)


## Data prep
count_df <- function(df, var) {
  df %>% 
    mutate(date = year(date)) %>% 
    group_by(.dots = c("data", var)) %>% 
    count()
}

## Plot function
plot_df <- function(df, var) {
  ggplot(df, aes(x = date, y=n)) +
  geom_bar(stat = "identity",aes_string(fill = var))
}

## Putting it all together
count_then_plot <- function(df, var) {
  df %>% 
    count_df(var) %>% 
    plot_df(var)
}

## Final repeat over a list of column names
vars_to_plot <- c("cars", "laptops")

vars_to_plot %>% 
  map(~count_then_plot(var = .), df)

由于我没有数据,所以我没有运行它,但它应该给出要点。

【讨论】:

  • 非常感谢!我不确定它是否正常工作,但这绝对是我的想法。
  • 尝试使用您的数据运行它?