简体   繁体   English

从一个 Dataframe - R 创建多个图

[英]Create Multiple Graphs from One Dataframe - R

I am trying to create a workflow that collects information (stock ticker data, 30 different tickers, with three different prices associated with an individual ticker) from a website, cleans the data (adds a date column relative to the day the information was collected), pushes it into a master file tsibble dataframe that holds new data points everyday and then graphs the price ranges on individual plots compiled onto one page.我正在尝试创建一个工作流程,从网站收集信息(股票代码数据、30 种不同的代码,与单个代码相关的三种不同价格),清理数据(添加与信息收集日期相关的日期列) , 将其推送到主文件tsibble dataframe 中,该文件每天保存新的数据点,然后将各个图的价格范围绘制在一页上。

Example df for one day below to be pushed into master df to hold all the data:下面一天的示例 df 被推送到主 df 以保存所有数据:

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"))

Second day of data:第二天数据:

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 Master file: rbind(df, df2) DF 主文件: rbind(df, df2)

       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

I had used facet_wrap_paginate to facet by stock ticker name, and create multiple graphs.我曾使用facet_wrap_paginate按股票代码名称进行分面,并创建多个图表。 However, I do not have the fine control over the axes and individual plots that I need when using a facet, so I must use an approach of plotting each ticker individually and compiling onto the same pages.但是,我无法很好地控制使用构面时需要的轴和单独的图,因此我必须使用一种方法来单独绘制每个代码并编译到相同的页面上。 I had used the code below:我使用了下面的代码:

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)

to achieve this.为达到这个。 The original datafram has ~30 induvidual tickers with the same 30 added to the df the next day, and then 30 more.原始数据帧有大约 30 个单独的代码,第二天将相同的 30 添加到 df 中,然后再添加 30 个。 I have tried using dplyr to group_by and plot, although I haven't been to acheive desired results.我尝试使用dplyrgroup_by和 plot,尽管我没有达到预期的结果。 I do not think that creating 30 plots manually with ggplot2 is very efficent, there must be a for loop that can allow for the selection of only certain tickers to then plot all of the data and use cowplot and extraGrid to compile all 30 generated plots.我不认为使用ggplot2手动创建 30 个图非常有效,必须有一个 for 循环可以只选择某些代码,然后 plot 所有数据并使用cowplotextraGrid编译所有 30 个生成的图。 Any help or thoughts on how to accomplish this would be great!任何关于如何实现这一点的帮助或想法都会很棒! Thanks!谢谢!

Generated some random data with some 30 random tickers across 4 days:在 4 天内用大约 30 个随机代码生成了一些随机数据:

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)

Converted date to date format:将日期转换为date格式:

rr_tsibble$date = as.Date(gsub("st|th|nd","",rr_tsibble$date), "%b %d, %Y")

Add the addUnits() function for formatting the large numbers:添加addUnits() function 以格式化大数字:

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!'
                                        )))))}

Make the list of plots:制作地块列表:

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)
}

There are 4 pages in total, each stored as an element of plotlist list.总共有 4 页,每页存储为plotlist列表的一个元素。 For example, the final page is the 4th element, and looks like this:例如,最后一页是第 4 个元素,如下所示:

plotlist[[4]]

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM