Как построить в лог-линейной BASE 2, используя BASI C plot () - без ggplot? - PullRequest
0 голосов
/ 15 марта 2020

В полном раскрытии я задал похожий - но другой - вопрос о построении графиков в логарифмическом режиме без ограничения базовой функцией c R и использования временных рядов.

Мне удалось получить Почти то, что я после, но в журнале базы 10. Мне нужна база 2. Вот код как:

require(RCurl)
require(foreign)
require(tidyverse)
x = getURL("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv")
corona = read.csv(text = x, sep =",",header = T)
corona <- corona %>% 
  pivot_longer(cols = -c(`Province.State`, `Country.Region`, Lat, Long),
               names_to = "date",
               values_to = "cases")
corona <- corona[,c("Country.Region","date","cases")]
corona <- corona[!is.na(corona$cases), ]

Spain <- corona[corona$Country.Region=='Spain',]
Spain <- Spain[Spain$cases>1,]
startDate <- as.Date("2020-02-09")
xm <- seq(startDate, by="1 day", length.out=nrow(Spain))
#plot(Spain$cases~xm, type='l', ylab="No. Cov-19 cases", xlab='', lwd=3, col=2,
#     main = "No. Cov-19 in Spain")


Italy <- corona[corona$Country.Region=='Italy',]
Italy <- Italy[(nrow(Italy)-nrow(Spain)+1):nrow(Italy),]
plot(Italy$cases~xm, type='l', ylab="No. Cov-19 cases", xlab='', lwd=3,
    log="y", col=2, las=2, 
    main = "No. Cov-19 in Italy (red) v Spain (blue)")

lines(Spain$cases~xm, type='l', ylab="No. Cov-19 cases", xlab='', lwd=3, col=4)

Вот график, который я хочу получить, но с самыми последними данными , который устанавливает максимальное количество дел на момент написания в 17 660, а даты на оси х:

enter image description here


Комбинация из оба ответа:

require(RCurl)
require(foreign)
require(tidyverse) # To tip the df from long row of dates to cols (pivot_longer())
x = getURL("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv")

corona = (read_csv(x)
          %>% pivot_longer(cols = -c(`Province/State`, `Country/Region`, Lat, Long),
                           names_to = "date",
                           values_to = "cases")
          %>% select(`Country/Region`, date, cases)
          %>% mutate(date=as.Date(date,format="%m/%d/%y"))
          %>% drop_na(cases)
          %>% rename(country="Country/Region")
)

cc <- (corona
       %>% filter(country %in% c("Italy","Spain", "Korea, South"))
)

ccw <- (cc
        %>% pivot_wider(names_from="country",values_from="cases")
        %>% filter(cumsum(Italy>0 | Spain>0)>=5)
)


plot(ccw$date, ccw$Italy, type="l", lwd=3,
        ylab='', 
        xlab='',
        log='y',
        col=5,
        axes=FALSE,
        main = "Log-lin cumulative COVID-19 cases in Italy and Spain v South Korea",
        cex.main=0.9)

at1 <- seq(min(ccw$date), max(ccw$date)+1, by=3);
axis.Date(1, at=at1, format="%b %d", las=2, cex.axis=0.7)


at2 <- 2^seq(1,30,by=1)
axis(side=2, at2, cex.axis=0.7)

abline(h=at2, lty=2, col="grey90")  # Add faint grid lines

lines(ccw$date, ccw$`Korea, South`, lwd=3, col=4, lty=3)
lines(ccw$date, ccw$Spain, lwd=3, col=2)

legend(ccw$date[1], 15000, legend=c("Korea", "Italy", "Spain"),
       col=c(4, 5, 2), lty=c(3,1,1), lwd=3, cex=0.8,
       box.lty=0)

enter image description here

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

Разница между натуральным логарифмом, лог-10 и лог-2 только в масштабировании; Различия связаны только с тем, как вы маркируете разрывы ...

Манипуляции с данными (слегка сжатые / улучшенные?)

corona = (read_csv(x)
 %>% pivot_longer(cols = -c(`Province/State`, `Country/Region`, Lat, Long),
                  names_to = "date",
                  values_to = "cases")
    %>% select(`Country/Region`, date, cases)
    %>% mutate(date=as.Date(date,format="%m/%d/%y"))
    %>% drop_na(cases)
    %>% rename(country="Country/Region")
)
cc <- (corona
    %>% filter(country %in% c("Italy","Spain"))
)
ccw <- (cc
    %>% pivot_wider(names_from="country",values_from="cases")
  ## select only since beginning of Italy/Spain epidemics
    %>% filter(cumsum(Italy>0 | Spain>0)>=1)
)

Теперь строим график, используя matplot():

par(las=1)
matplot(ccw$date, ccw[,-1], type="l",ylab="No. Cov-19 cases", xlab='', lwd=3,
        log="y", las=2,
        col=c("red","blue"),
        axes=FALSE,
        main = "No. Cov-19 in Italy (red) v Spain (blue)")
## custom axes
axis.Date(side=1,x=ccw$date)
axis(side=2,at=2^seq(1,14,by=2))
box()

Вы можете решить, соответствует ли это расстояние между перерывами.

enter image description here

1 голос
/ 15 марта 2020
Italy$cases2 <- log2(Italy$cases)
Spain$cases2 <- log2(Spain$cases)

plot(Italy$cases2~xm, type='n', ylab="No. Cov-19 cases", xlab='',
     las=2, 
     xlim=c(min(xm), max(xm)+1), # Increase x-axis by one day
     ylim=c(1, log2(max(Italy$cases))), 
     xaxt="n", yaxt="n",  # Turn off x and y-axis
     main = "No. Cov-19 in Italy (red) v Spain (blue)",
     bty='L')  

at1 <- seq(min(xm), max(xm)+1, by=3);
axis.Date(1, at=at1, format="%b %d", las=2)

at2 <- seq(from=1, to=15, by=1); # Modify these to suit
axis(side=2, at=at2, labels=2^at2, las=1)

abline(h=at, lty=2, col="grey90")  # Add faint grid lines

lines(Italy$cases2~xm, lwd=3, col=2)
lines(Spain$cases2~xm, lwd=3, col=4)

enter image description here

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