2016-11-01 2 views
-1

Я хочу построить этот фрейм данных с месяцем по оси x.Месячные ежемесячные данные с использованием ggplot или графика

 month value1 value2 value3 value4 
    1 Okt 19.5505 19.6145 19.5925 19.3710 
    2 Nov 21.8750 21.7815 21.7995 20.5445 
    3 Dez 25.4335 25.2230 25.2800 22.7500 

    attach(Mappe1) 
    month <- Mappe1$month 
    value1 <- Mappe1$value1 
    value2 <- Mappe1$value2 
    value3 <- Mappe1$value3 
    value4 <- Mappe1$value4 

Я пробовал разные решения, но с этим кодом на месяцы plottet обращенно (Дез, ноябрь, октябрь, InstEd из Okt, ноябрь, Dez):

plot(x=month, y=value1, type="l", col="red") 
    lines(x=month, y=value2, type="l", col="seagreen") 
    lines(x=month, y=value3, type="l", col="cyan") 
    lines(x=month, y=value4, type="l", col="black", lwd=2) 

с помощью ggplot2 я получаю сообщение об ошибке сообщение: Ошибка: недопустимый ввод: time_trans работает с объектами класса POSIXct только

ggplot(Mappe1, aes(x=month, y=value1)) + geom_point() + 
    scale_x_datetime(breaks = date_breaks("1 month"), labels = date_format("%B")) + 
    xlab("month") + ylab("values") 

я очень новый для R студии и очень благодарные о любой помощи!

+1

Не могли бы вы добавить код, необходимый для создания «Mappe1»? Тогда кто-то может дать вам полный ответ. Сделайте это с помощью 'dput (Mappe1)'. – Bobby

+2

Возможный дубликат [Изменить порядок дискретной шкалы x] (http://stackoverflow.com/questions/3253641/change-the-order-of-a-discrete-x-scale) – Bobby

+0

Имейте в виду, 'scale_x_datetime 'работает только с переменными типа' Date'. Ваша переменная 'month' не является элементом' Date', а 'factor' – yeedle

ответ

1

Если вы не скажете R, каковы уровни вашего фактора, он определяет свой собственный порядок. Достаточно хорошо угадать, когда есть неотъемлемый порядок, но проблема здесь связана с тем, что ваше соглашение об именовании в месяц не подходит для конвенции R, основанной на английских написаниях. Вы можете либо изменить название ваших факторов на английский, что будет "Oct", "Nov" и "Dec" за месяцы, которые вы указали, или, в более общем плане, определить факторы самостоятельно.

Для последнего, при условии, данных кадра Mappe1:

Mappe1$month <- factor(Mappe1$month, levels = c("Okt", "Nov", "Dez")) 

Добавить в c() все из месяцев у вас есть, в соответствующем порядке.

Вы также можете использовать функцию levels(), как так

levels(Mappe1$month) <- c("Okt", "Nov", "Dez") 
+0

Большое спасибо за ваш быстрый ответ! С df $ month <- factor (df $ month, levels = c ("Okt", "Nov", "Dez")) Я получил следующую ошибку: объект типа «замыкание» не подмножество. Но без «df» он работает очень хорошо! –

+0

Вам нужно изменить 'df' на имя вашего фрейма данных (' Mappe1' в вашем случае, я думаю, из вашего исходного сообщения) –

+0

Теперь есть черные горизонтальные полосы в позиции значений соответствующего месяца. Они такие же широкие, как столбцы каждого месяца. Могу ли я их каким-то образом удалить? И значение1 не показано на сюжете ... Что может быть причиной этого? –

1

tidyverse подход -

library(tidyverse) 

data.raw = "month value1 value2 value3 value4 
Okt 19.5505 19.6145 19.5925 19.3710 
Nov 21.8750 21.7815 21.7995 20.5445 
Dez 25.4335 25.2230 25.2800 22.7500" 

months <- tribble(
    ~month, ~result, 
    "Okt", "Oct", 
    "Nov", "Nov", 
    "Dez", "Dec" 
) 

data = read_tsv(data.raw) 

data %>% 
    left_join(months) %>% 
    mutate(month = as.Date(sprintf("2016-%s-01", result), "%Y-%b-%d")) %>% 
    select(-result) %>% 
    gather(series, value, -month) %>% 
    ggplot(aes(month, value, colour = series)) + 
    geom_line() + 
    scale_x_date(date_breaks = "1 month", date_labels = "%B") + 
    xlab("month") + ylab("values") 
#> Joining, by = "month" 

tidyverse

+0

Благодарим вас за ответ. Я просто попробовал, но получил ошибку «Нет общих переменных. Пожалуйста, укажите' by' param ». Как я могу это решить? –

0

Большое спасибо за ваши ответы! Я попробовал это так:

t = read.csv("Mappe1.csv", header = TRUE, sep=";", dec = ".", fill = TRUE, comment.char = "") 

    t$m <- factor(t$m, levels = c("Okt", "Nov", "Dez")) 

    library(Hmisc) 

    xyplot(t$value1~t$m, type = "l", col = "red", ylab="values") 
    lines(t$value2~t$m, type = "l", col = "cyan") 
    lines(t$value3~t$m, type = "l", col = "purple") 
    lines(t$value4~t$m, type = "l", col = "black", lwd = 2) 
    legend("topleft", legend=c("value1", "value2", "value3", "value4"), 
     col=c("red", "cyan", "purple", "black"), lty=1:1, cex=0.8) 

он работал очень хорошо для этого примера. , но когда я попробовал exactely так же, но с разными значениями, только value1 является plottet и я всегда получаю следующие ошибки:

Error in plot.xy(xy.coords(x, y), type = type, ...) : 
     plot.new has not been called yet 
    Error in strwidth(legend, units = "user", cex = cex, font = text.font) : 
     plot.new has not been called yet 

Я уже подал plot.new() и dev.off(). Но иногда я все еще получаю эти ошибки, или иногда R не показывает ошибок, но вообще не замышляет.

В чем может быть проблема?

+0

Не стоит спрашивать об этом в новом вопросе, у меня нет большого опыта работы с xyplot. Если вы хотите сделать это с помощью ggplot, вам нужно будет «расплавить» ваши данные до длинного формата, а затем вы можете построить его по времени. –

Смежные вопросы