首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从一个Dataframe -R创建多个图形

从一个Dataframe -R创建多个图形
EN

Stack Overflow用户
提问于 2021-05-04 01:38:19
回答 1查看 66关注 0票数 0

我正在尝试创建一个从网站收集信息(股票报价器数据,30个不同的报价器,与单个报价器关联的三种不同价格)的工作流程,清理数据(添加与收集信息的日期相关的日期列),将其推送到主文件tsibble dataframe中,该文件每天保存新的数据点,然后在编译到一页上的单个绘图上绘制价格范围。

下面一天的示例df推送到master df中,保存所有数据:

代码语言:javascript
运行
复制
df <- data.frame(ticker = c("XLU", "XLK", "XLF", "XLE", "XLP"),
             buy_price = c(62.00, 68.00, 37.00, 55.00, 41.00),
             sale_price = c(64.00, 71.00, 42.00, 60.00, 45.00),
             close_price = c(63.00, 70.00, 38.00, 56.00, 43.00),
             date = c("April 29th, 2021", "April 29th, 2021", "April 29th, 2021", "April 29th, 2021", "April 29th, 2021"))

第二天的数据:

代码语言:javascript
运行
复制
df2 <- data.frame(ticker = c("XLU", "XLK", "XLF", "XLE", "XLP"),
                 buy_price = c(63.00, 69.00, 38.00, 53.00, 44.00),
                 sale_price = c(66.00, 77.00, 47.00, 63.00, 48.00),
                 close_price = c(65.00, 74.00, 39.00, 55.00, 45.00),
                 date = c("April 30th, 2021", "April 30th, 2021", "April 30th, 2021", "April 30th, 2021", "April 30th, 2021"))

DF主文件:rbind(df, df2)

代码语言:javascript
运行
复制
       ticker buy_price sale_price close_price             date
1     XLU        62         64          63 April 29th, 2021
2     XLK        68         71          70 April 29th, 2021
3     XLF        37         42          38 April 29th, 2021
4     XLE        55         60          56 April 29th, 2021
5     XLP        41         45          43 April 29th, 2021
6     XLU        63         66          65 April 30th, 2021
7     XLK        69         77          74 April 30th, 2021
8     XLF        38         47          39 April 30th, 2021
9     XLE        53         63          55 April 30th, 2021
10    XLP        44         48          45 April 30th, 2021

我已经使用facet_wrap_paginate按股票代码名称进行刻面,并创建了多个图形。但是,在使用facet时,我无法对轴和单个绘图进行精细控制,因此我必须使用单独绘制每个滚动条并编译到相同页面上的方法。我使用了下面的代码:

代码语言:javascript
运行
复制
for(i in 1:4){
    rr_plot <- ggplot(rr_tsibble, aes(x = DATE, color = TREND)) +
    geom_point(aes(y = BUY.TRADE), size = 1.5) +
    geom_point(aes(y = SELL.TRADE), size = 1.5) +
    geom_point(aes(y = PREV.CLOSE), color = "black", size = 1, shape = 1) +
    ggforce::facet_wrap_paginate(~TICKER,
                                 nrow = 2,
                                 ncol = 4,
                                 scales = "free_y",
                                 page = i) +
    scale_y_continuous()
    print(rr_plot)

来实现这一点。原始数据报有大约30个行业报价器,第二天将同样的30个报价器添加到df中,然后再添加30个。我已经尝试过使用dplyrgroup_by和绘图,尽管我还没有达到预期的效果。我不认为用ggplot2手动创建30个图是非常有效的,必须有一个for循环,它只允许选择特定的滚动条,然后绘制所有数据,并使用cowplotextraGrid编译所有30个生成的图。任何关于如何实现这一点的帮助或想法都将是很棒的!谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-04 08:49:05

在4天内生成了一些随机数据,大约有30个随机的报价器:

代码语言:javascript
运行
复制
r <- function() {abs(c(rnorm(29,50,2),100000)*rnorm(1,10,1))}
tickers = sapply(1:30, function(x) toupper(paste0(sample(letters, 3), collapse = "")))
df <- data.frame(ticker = tickers,
                 buy_price = r(),
                 sale_price = r(),
                 close_price = r(),
                 date = rep("April 29th, 2021",30))
df2 <- data.frame(ticker = tickers,
                  buy_price = r(),
                  sale_price = r(),
                  close_price = r(),
                  date = rep("April 30th, 2021",30))
df3 <- data.frame(ticker = tickers,
                  buy_price = r(),
                  sale_price = r(),
                  close_price = r(),
                  date = rep("May 1st, 2021",30))
df4 <- data.frame(ticker = tickers,
                  buy_price = r(),
                  sale_price = r(),
                  close_price = r(),
                  date = rep("May 2nd, 2021",30))
rr_tsibble <- rbind(df, df2, df3, df4)

已将date转换为日期格式:

代码语言:javascript
运行
复制
rr_tsibble$date = as.Date(gsub("st|th|nd","",rr_tsibble$date), "%b %d, %Y")

添加用于格式化大数的addUnits()函数:

代码语言:javascript
运行
复制
addUnits <- function(n) {
  labels <- ifelse(n < 1000, n,  # less than thousands
                   ifelse(n < 1e6, paste0(round(n/1e3,3), 'k'),  # in thousands
                          ifelse(n < 1e9, paste0(round(n/1e6,3), 'M'),  # in millions
                                 ifelse(n < 1e12, paste0(round(n/1e9), 'B'), # in billions
                                        ifelse(n < 1e15, paste0(round(n/1e12), 'T'), # in trillions
                                               'too big!'
                                        )))))}

制作绘图列表:

代码语言:javascript
运行
复制
plotlist <- list()
for (i in 1:ceiling(30/8))
{
  plotlist[[i]] <- ggplot(rr_tsibble, aes(x = date)) +
    geom_point(aes(y = buy_price), size = 1.5) +
    geom_point(aes(y = sale_price), size = 1.5) +
    geom_point(aes(y = close_price), color = "black", size = 1, shape = 1) +
    scale_y_continuous(breaks = pretty_breaks(), labels = addUnits) +
    ggforce::facet_wrap_paginate(~ticker,
                                 nrow = 2,
                                 ncol = 4,
                                 scales = "free_y",
                                 page = i)
}

总共有4个页面,每个页面都存储为plotlist列表的一个元素。例如,最后一个页面是第4个元素,如下所示:

代码语言:javascript
运行
复制
plotlist[[4]]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67373354

复制
相关文章

相似问题

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