Постройте две гистограммы двух наборов данных .csv, чтобы сравнить данные в R (ggplot) - PullRequest
1 голос
/ 08 ноября 2019

У меня есть два набора данных, которые я хотел бы сравнить на одном графике (цена Ethereum и объем транзакции). Я построил график, но я думаю, что это неправильно с масштабом оси Y:

ETH_price <- read.table(file = '~/R/export-EtherPrice.csv' , header = T, sep=";")

transaction_volume <- read.csv(file = '~/R/export-TxGrowth.csv', header = T, sep=";")

head(ETH_price)

head(transaction_volume)

ETH_price$Date.UTC. <- as.Date(ETH_price$Date.UTC., format = "%m/%d/%Y")

str(ETH_price) # verify the date format

transaction_volume$Date.UTC. <- as.Date(transaction_volume$Date.UTC., format = "%m/%d/%Y") 

str(transaction_volume) # verify the date format

ggplot(ETH_price,aes(x = Date.UTC.,y = Value)) + 
  geom_point()+
  geom_line(aes(color="ETH_price")) +
  geom_line(data=transaction_volume,aes(x = Date.UTC.,y = Value, color="transaction_volume")) +
  labs(color="Legend") +
  scale_colour_manual("", breaks = c("ETH_price", "transaction_volume"),
                      values = c("blue", "brown")) +
  ggtitle("Correlation of ETH price and transaction volume") + 
  theme(plot.title = element_text(lineheight=.7, face="bold"))

Произошла следующая ошибка:

Error in seq.int(0, to0 - from, by) : 'to' must be a finite number

Данные выглядят так (ETH_price):

> head(transaction_volume)

   Date.UTC. UnixTimeStamp Value
1 03.03.2017    1488499200 64294
2 04.03.2017    1488585600 58756
3 05.03.2017    1488672000 57031
4 06.03.2017    1488758400 57020
5 07.03.2017    1488844800 62589
6 08.03.2017    1488931200 55386

Сюжет выглядит так:

new_wrong_plot_edited

У кого-нибудь есть идеи, что может быть не так?

Я рад каждому совету! :)

MAiniak

/ Код обновлен

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Спасибо за ваши ответы!

Я проверил набор данных, и было несколько поврежденных строк, которые я выбросил. Теперь у меня есть очень простая проблема (извините, что только начал работать с R), данные в Excel выглядят так: Excel_data

Если я вернусь к первому столбцу, дата будетушел, потому что столбец не имеет формата даты, вместо этого есть несколько случайное число. У меня просто были наборы данных, в которых были все данные в первом столбце, который я импортировал в R. Я попробую исходный код с новыми данными, которые в настоящее время выглядят так в R:

    > head(transaction_volume)

   Date.UTC. UnixTimeStamp Value
1 03.03.2017    1488499200 64294
2 04.03.2017    1488585600 58756
3 05.03.2017    1488672000 57031
4 06.03.2017    1488758400 57020
5 07.03.2017    1488844800 62589
6 08.03.2017    1488931200 55386

Как я могу прочитатьв данных, так что R будет распознавать так же, как это было, когда данные были в первом столбце .csv?

Извините за беспокойство.

0 голосов
/ 08 ноября 2019

Подведем итоги всех критических шагов для решения вашего вопроса.

1) Вы должны манипулировать форматом даты для правильного построения графика ggplot.

2) Поскольку ваши значения ETH_price и транзакция_объема не находятся в одном масштабе, для построения графикаих на одном графике, вы должны использовать трюк, описанный @ r2evans в этом посте: две оси Y с разными масштабами для двух наборов данных в ggplot2 [duplicate] .

Итак,ваш код должен выглядеть примерно так:

# Here I re-created a small part of your dataset here just for the example
Date.UTC. = c("03.03.2017","04.03.2017","05.03.2017","06.03.2017","07.03.2017","08.03.2017")
Value = c(64294,58756,57031,57020,62589,55386)
transaction_volume = data.frame(Date.UTC.,Value)

Value = c(19.54,19.45,20.45,22.67,23.34,21.89)
ETH_price = data.frame(Date.UTC.,Value)

# Managing Date format
ETH_price$Date.UTC. = as.Date(ETH_price$Date.UTC., format = "%m.%d.%Y")
transaction_volume$Date.UTC. = as.Date(transaction_volume$Date.UTC., format = "%m.%d.%Y")
str(ETH_price) # to check the correct format of your dataset
str(transaction_volume) # to check the correct format of your dataset

# Merging dataset
ETH_price$z = "ETH_price"
transaction_volume$z = "transaction_volume"

# Defining the scale factor (you can adapt this part according your preferences for plotting)
scale_factor = mean(transaction_volume$Value / ETH_price$Value)
df_temp = within(transaction_volume, {Value = Value / scale_factor})
df = rbind(ETH_price,df_temp)
df

# Plotting both datasets
library(ggplot2)
mycolors = c("ETH_price" = "blue", "transaction_volume" = "red")
ggplot(df, aes(x = Date.UTC., y = Value, group = z, color = z)) +
  geom_path() +
  geom_line() +
  scale_y_continuous(name = "ETH_price", sec.axis = sec_axis(~scale_factor*., name = "transaction_volume")) +
  scale_color_manual(name = "Datasets", values = mycolors) +
  theme(
    axis.title.y = element_text(color = mycolors["ETH_price"]),
    axis.text.y = element_text(color = mycolors["ETH_price"]),
    axis.title.y.right = element_text(color = mycolors["transaction_volume"]),
    axis.text.y.right = element_text(color = mycolors["transaction_volume"])
  )

Итак, вы должны получить следующий график: enter image description here

Итак, я думаю, что это должно решитьваш вопрос;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...