R:ggplot给出了一个错误的模糊的图表

i2byvkas  于 2023-04-09  发布在  其他
关注(0)|答案(3)|浏览(109)

我试着画一个图表来显示股票的价值是如何随时间变化的。但是当我运行代码时,出现的图表真的是错的。
我注意到在'plotdata'输出中所有的日期都被标记为。
因为我是新来的,我不知道下一步该怎么办。
以下是该表的摘录:

下面是我的代码:

library("readxl")
library("ggplot2")

generate_plot <- function(data, stockname) {
    stockdata <- data[[stockname]]
    dates <- data[["Date"]]

    for (i in 1:length(dates)) {
        dates[[i]] <- as.Date(dates[[i]], format = "%m-%d-%Y")
    }

    plotdata <- data.frame(stockdata, dates)

    plot <- ggplot(plotdata, aes(x = x, y = y)) + geom_point()

    print(head(plotdata))

    return(plot)
}

stockmarketdata <- read_xlsx("newstockmarket.xlsx")

aktiennamen <- head(names(stockmarketdata), -4)

plot <- generate_plot(data, aktiennamen[[1]])

print(plot)

ggsave("plot.png", plot = plot)

下面是它生成的图表:

我试着改变一些小细节,但没有什么明显的改变。

eimct9ow

eimct9ow1#

我不是100%确定你想要的输出是什么,但这里有一个例子可以让你开始:

library(ggplot2)
library(tidyverse)

# recreating your data
df <- tibble(
  Date = as.Date(c("2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05", "2018-01-06")),
  NYSE = runif(n = 5, min = 14000, max = 16000),
  NASDAQ = runif(n = 5, min = 7000, max = 7200),
  LSE = runif(n = 5, min = 3700, max = 3800)
)

# plotting after creating the data in long format so it can be grouped
df %>%
  pivot_longer(cols=-Date,
               names_to="stock",
               values_to="price") %>%
  ggplot(aes(x=Date, y=price, color=stock)) +
    geom_line() +
    geom_point()

这应该会产生这样的图(假设所有其他选项都是默认的):

q0qdq0h2

q0qdq0h22#

将%m-$d-%Y日期转换为日期格式的代码未按预期方式工作。

dates <- c("1-2-2018", "1-3-2018")
for (i in 1:length(dates)) {
  dates[[i]] <- as.Date(dates[[i]], format = "%m-%d-%Y")
}
str(dates)
#chr [1:2] "17533" "17534"

比较

dates <- c("1-2-2018", "1-3-2018")
dates <- as.Date(dates, format = "%m-%d-%Y")
str(dates)
#Date[1:2], format: "2018-01-02" "2018-01-03"

我们想要第二个版本,所以输出是日期格式而不是字符,所以ggplot 2会正确排序并显示合理的中断。您的字符日期显示为每一天,如文本“17533”-这就是为什么它看起来如此错误。(第二种方式对于R也更惯用,其中大多数操作都是矢量化的,可以一次应用于整个列,而不是手动为每个元素创建循环。更多背景:https://www.noamross.net/archives/2014-04-16-vectorization-in-r-why/
第一个版本并不像你预期的那样工作,因为它要求R逐个替换字符向量的每个元素,所以它需要将日期强制转换为字符数据以适应向量的其余部分的类型,在本例中,它通过转换为数字(自1970-01-01以来的天数)然后将其转换为文本来实现。

as.character(as.numeric(as.Date(dates, format = "%m-%d-%Y")))
holgip5t

holgip5t3#

您可以简化代码,只需将股票名称转换为字符格式。您不必执行for循环来更改日期格式,并且可以直接在aes()函数中选择要绘制的列,而无需创建新的数据集。

library(readxl)
library(tidyverse)

generate_plot <- function(data, stockname) {

  plot <- ggplot(data) + 
    aes_string(x = "Date", y = stockname) +
  geom_point()

  print(stockname)
  
  return(plot)
}

stockmarketdata <- read_xlsx("newstockmarket.xlsx")

stockmarketdata$Date=as.Date(stockmarketdata$Date, format = "%m-%d-%Y")

plot <- generate_plot(stockmarketdata, "BTC")

print(plot)

ggsave("plot.png", plot = plot)

如果您想绘制许多列,可以使用purrr包(包含在tidyverse包中)中的map()函数。

colnames_to_plot=colnames(stockmarketdata)

plot_list=map(colnames_to_plot,~{ 
generate_plot(stockmarketdata, .x)})

plot_list

相关问题