[英]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.我尝试使用
dplyr
到group_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 所有数据并使用cowplot
和extraGrid
编译所有 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.