#r #plot #axis-labels
#r #печать #ось-метки
Вопрос:
«Версия R 4.0.3 (2020-10-10)»
У меня есть некоторые данные временных рядов, в которых я пытаюсь посмотреть на изменение потребления с течением времени. Вот reprex.
set.seed(1)
date <- seq(as.POSIXct('2010-01-01'),as.POSIXct('2010-04-10'),by=86400)
Consumption <- rnorm(99)
Data <- data.frame(date,Consumption)
plot(Data$Consumption~Data$date,type='l') # X-axis labels and ticks not printing
par(yaxt='n')
axis(side = 2,at=seq(-3,3,0.5),labels = seq(-3,3,0.5)) # This works on the first plot on the y axis
plot(Data$date~Data$Consumption,type='l') # X-axis refusing to print despite assigning it.
par(xaxt='n')
axis(side = 1,at=seq(-3,3,0.5),labels = seq(-3,3,0.5)) # This works on the first plot
График, выводимый в начале plot()
, — это именно то, что я хочу, за исключением того факта, что у него нет меток для оси x.
Я использую базовую графику для назначения, а не для повседневного использования, и обычно использую ggplot. Я пытался выяснить, почему ось x не отображается. Изначально я думал, что проблема связана с переменной date, и попытался ее очистить lubridate::ymd()
. Однако, когда я начал делать вышеупомянутый reprex для целей этого вопроса, становится ясно, что метки по оси X и галочки в целом не печатаются. На втором графике я помещаю переменную потребления на ось x. Я был удивлен, обнаружив, что дата сама по себе аккуратно печатается по оси Y.
Что я делаю не так?
Ответ №1:
Если вы хотите больше контролировать то, что происходит с метками оси и заголовком, вы можете создать их вручную. Итак, сначала создайте график без заголовка и метки. Затем создайте их вручную с axis()
помощью и mtext()
. В процессе вы можете увеличить пространство в нижней части графика с par(mar=...)
помощью . Точная настройка выполняется с помощью аргументов типа las
, cex.axis
, и line
. И в конце вы возвращаетесь mar
к своим старым значениям.
Вы можете использовать приведенный ниже код для получения более подробных меток по оси X
### format to day (probably not the best way to do this)
Data$date2 <-format(Data$date, "%d%b")
Data$date2 <- as.Date(Data$date2, format = "%d%b")
### increase room at bottom of the plot for X-axis title
### the labels will eat up space, if we do nothing it will be a mess
### set title with mtext later
par(mar = c(7,4,4,2))
### plot without X-axis labels (xaxt) and title (xlab)
### work with "at" and "labels" in axis-function
### rotate labels 90° (las) an reduce font (cex.axis)
### put title 5 lines below graph (line)
###
### Remark: the graph window has to be big enough
plot(Data$Consumption ~ Data$date, type= "l", xaxt = "n", xlab = NA)
axis(side = 1, at = Data$date, labels = Data$date2, las = 2, cex.axis=.75)
mtext(side = 1, text = "Date", line = 5)
Это приводит к следующему графику:
АЛЬТЕРНАТИВНЫЕ отметки и метки для каждого 7-го элемента
per7 <- seq(1, 99, 7)
plot(Data$Consumption ~ Data$date, type= "l", xaxt = "n", xlab = NA)
axis(side = 1, at = Data$date[per7], labels = Data$date2[per7], las = 2, cex.axis=.75)
mtext(side = 1, text = "Date", line = 5)
### reset mar
par(mar = c(5,4,4,2))
что дает следующую картину:
Пожалуйста, дайте мне знать, это то, что вы хотели.
Комментарии:
1. Пожалуйста, обратите внимание, что когда мы включаем два графика, ваше решение по-прежнему выдает ошибку:
Data$date2 <-format(Data$date, "%d%b") Data$date2 <- as.Date(Data$date2, format = "%d%b") par(mar = c(7,4,4,2)) plot(Data$Consumption ~ Data$date, type= "l", xaxt = "n", xlab = NA) axis(side = 1, at = Data$date, labels = Data$date2, las = 2, cex.axis=.75) mtext(side = 1, text = "Date", line = 5) plot(Data$date ~ Data$Consumption, type= "l", xaxt = "n", xlab = NA)
2. Я не получаю никаких ошибок на своей стороне. Что это за сообщение об ошибке?
3. Такого сообщения об ошибке нет. Всякий раз, когда мы строим две диаграммы внутри блока, на второй всегда будут отсутствовать метки. Но если вы разместите каждую диаграмму в разных фрагментах, она будет работать правильно для правильного отображения меток осей.
4. @doctshinds 1. Я не думаю, что потребление должно составлять 100 значений — R буквально жалуется на это. 2. Теперь я понимаю, в чем проблема.
par()
не сбрасывается при каждом графике, что почему-то не имеет для меня смысла. Как только я все сбросил, все сработало как по волшебству. @KoenV График работает так, как ожидалось. если вы читали выше, я понял, что проблема заключается в необходимости сброса par() с каждым графиком. И, похожеxaxt='n'
, включениеpar()
делает его более постоянным и требует перезагрузкиxaxt='s'
. Сохранение его в вызове ‘plot ()’ изменяет параметры для каждого графика.
Ответ №2:
Есть две проблемы, которые я легко вижу:
- измените: потребление <- rnorm(99) на потребление <- rnorm(100), чтобы соответствовать столбцу даты.
- Проблема в «par». Когда в блоке несколько графиков, в отличие от ggplot, график не обрабатывается должным образом. Удалите par и запустите приведенное ниже, оно должно работать
set.seed(1)
date <- seq(as.POSIXct('2010-01-01'),as.POSIXct('2010-04-10'),by=86400)
Consumption <- rnorm(100)
Data <- data.frame(date,Consumption)
plot(Data$Consumption~Data$date,type='l')
plot(Data$date~Data$Consumption,type='l')
Пожалуйста, обратите внимание, что всякий раз, когда вы определяете par и когда вы запускаете каждый график в двух разных частях, метки будут отображаться правильно. У вас не возникнет никаких проблем. Но когда вы строите обе диаграммы в одном блоке, у вас всегда будут проблемы, если у вас есть par.