首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何绘制折线图中每行10列中的数字

如何绘制折线图中每行10列中的数字
EN

Stack Overflow用户
提问于 2020-12-06 04:01:02
回答 1查看 30关注 0票数 0

这看起来很简单。我可以很容易地在Excel中做到这一点,但我想通过R自动化这一过程。我已经安装了ggplot2。使用我在CSV文件中读取的RStudio。

得到的数据帧有200多行,每行都是新汉普郡的一个小镇。第一列的标题是“城镇”,下面的每一行都有城镇的文本名称(例如,“协和”或“兰开斯特”)。第2列包含每个城镇的数字(每个小学生的开支),CSV文件中该列的标题是"01/02 Elem PPE“-但在使用View()时它显示为"X01.02.Elem.PPE”。列3对每个城镇都有类似的数字,并且它在View()中的标题是"X02.03.Elem.PPE“。第4列到第11列类似。

我只想绘制一行(一个城镇)的列2-11中的数字的折线图。它将显示该城镇每个学生的支出如何随着时间的推移而变化。肯定有一种简单的方法可以做到这一点,但我找不到。

请帮帮忙。我是一个77岁的人,3-50年前有一些编程经验,但直到昨天才刚刚接触R和Rstudio。

EN

回答 1

Stack Overflow用户

发布于 2020-12-06 04:35:59

首先,我将创建一些模仿您的数据的新数据。它应该具有或多或少相同的属性。

代码语言:javascript
复制
library(glue)
library(tidyverse)
set.seed(4314)
mat <- matrix(rpois(40, 5000), ncol=10)
colnames(mat) <- glue("X{sprintf('%2.0f', 1:10)}.{sprintf('%2.0f', 2:11)}.Elem.PPE", sep="") %>% 
  gsub(". ", ".0", ., fixed=TRUE) %>% 
  gsub("X ", "X0", ., fixed=TRUE)

df <- tibble(town = c("Concord", "Lancaster", "Manchester", "Nashua"))
df <- bind_cols(df, as_tibble(mat))

现在,这就是你要开始的地方。我假设您将csv读取到一个名为df的对象中。为了使绘图更容易,您应该做的第一件事是将数据从宽表单(每个观察一行10列)转换为每个观察1列10行的长表单。我将把它保存在一个名为df2的对象中。tidyr包中包含pivot_longer函数。第一个参数是您想要从宽形式更改为长形式的列,在本例中,它是除town之外的所有列。然后告诉它列名的变量名和值的变量名。然后,出于绘图目的,我只使用了几个正则表达式从X01.02.Elem.PPE转到01/02

代码语言:javascript
复制
df2 <- df %>% 
  pivot_longer(-town, names_to="time", values_to="val") %>% 
  mutate(time = gsub("X(.*)\\.Elem\\.PPE", "\\1", time), 
         time = gsub("\\.", "/", time))

生成的数据框如下所示:

代码语言:javascript
复制
# # A tibble: 40 x 3
#   town    time    val
#   <chr>   <chr> <int>
# 1 Concord 01/02  4965
# 2 Concord 02/03  4953
# 3 Concord 03/04  5066
# 4 Concord 04/05  5100
# 5 Concord 05/06  4979
# 6 Concord 06/07  5090
# 7 Concord 07/08  5136
# 8 Concord 08/09  5076
# 9 Concord 09/10  5079
# 10 Concord 10/11  4945

接下来,我们可以为一个地方绘制一个图(在我们考虑自动化之前)。让我们试试协和。首先,我们将保存要放在x轴上的值:

代码语言:javascript
复制
xlabs <- unique(df2$time)

接下来,我们可以使用ggplot()绘制绘图。在下面的代码中,我们首先将数据帧传输到一个过滤器,该过滤器将提取单个城镇的值。过滤后的数据帧被输送到ggplot()函数中。由于数据框中的time是一个字符矢量,因此我们需要将其转换为因子,然后再转换为数值,以绘制线条图。我们添加直线几何图形来绘制直线。然后,我们使用scale_x_continuous()更改x轴标签。labs()函数用于更改x轴和y轴的轴标签。最后,ggtitle()将标题放在绘图的顶部。我也喜欢theme_bw()而不是灰色的背景,但这完全是个人喜好的问题。生成的图如下所示:

代码语言:javascript
复制
df2 %>% filter(town == "Concord") %>% 
  ggplot(aes(x=as.numeric(as.factor(time)), y=val)) + 
  geom_line() + 
  scale_x_continuous(breaks=1:10, labels = xlabs) + 
  labs(x="Time", y="Spending per Pupil") + 
  ggtitle("Concord") + 
  theme_bw()

现在,您提到的下一个部分是自动化-您希望对原始数据框的每一行执行此操作。我们可以这样做。首先,untown从数据中获取town的唯一值。for()循环从1循环到untown中的值数。然后您可以看到"Concord"在上一张图中的位置,我们现在有了untown[i]。我们还在末尾使用ggsave(),并将城镇名称和.png粘贴在一起。这将在R的工作目录中为每个城镇创建一个不同的图。

代码语言:javascript
复制
untown <- unique(df2$town)
for(i in 1:length(untown)){
  df2 %>% filter(town == untown[i]) %>% 
    ggplot(aes(x=as.numeric(as.factor(time)), y=val)) + 
    geom_line() + 
    scale_x_continuous(breaks=1:10, labels = xlabs) + 
    labs(x="Time", y="Spending per Pupil") + 
    ggtitle(untown[i]) + 
    theme_bw()
  ggsave(glue("{untown[i]}.png"), width=9, height=6)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65161382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档