R масштабирование оси барплота - PullRequest
5 голосов
/ 27 ноября 2011

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

x = c(1:81)
barplot(x)
axis(side=1,at=c(0,20,40,60,80),labels=c(20,40,60,80,100))

Как видите, ось x не растягивается по всему графику, а останавливается где-то посередине. Мне кажется, что проблема довольно простая, но я почему-то не могу ее исправить и пока не могу найти никакого решения: (

Любая помощь очень ценится.

Ответы [ 2 ]

12 голосов
/ 27 ноября 2011

Проблема в том, что barplot действительно предназначен для построения категориальных, а не числовых данных, и поэтому он в значительной степени делает свое дело с точки зрения настройки масштаба по горизонтальной оси.Основной способ обойти это - восстановить фактические x-позиции средних точек бара, сохранив результаты barplot в переменной, но, как вы можете видеть ниже, я не нашел элегантного способа сделать то, чтоВы хотите в базовой графике.Может быть, кто-то еще может сделать лучше.

x = c(1:81)
b <- barplot(x)
## axis(side=1,at=c(0,20,40,60,80),labels=c(20,40,60,80,100))
head(b)

Здесь вы можете видеть, что фактические срединные точки равны 0,7, 1,9, 3,1, ... - а не 1, 2, 3 ...

Это довольно быстро, если вы не хотите расширять ось от 0 до 100:

b <- barplot(x)
axis(side=1,at=b[c(20,40,60,80)],labels=seq(20,80,by=20))

Это мой лучший шанс сделать это в базовой графике:

b <- barplot(x,xlim=c(0,120))
bdiff <- diff(b)[1]
axis(side=1,at=c(b[1]-bdiff,b[c(20,40,60,80)],b[81]+19*bdiff),
              labels=seq(0,100,by=20))

Вы можете попробовать это, но столбики не такие красивые:

plot(x,type="h",lwd=4,col="gray",xlim=c(0,100))

Или в ggplot:

library(ggplot2)
d <- data.frame(x=1:81)
ggplot(d,aes(x=x,y=x))+geom_bar(stat="identity",fill="lightblue",
                   colour="gray")+xlim(c(0,100))

Большинство статистических графических ботаниковскажет вам, что графические количественные (x, y) данные лучше выполнять с точками или линиями, а не с чертами (не чернила данных, Tufte, бла-бла-бла :-))

1 голос
/ 27 ноября 2011

Не совсем точно, что вы хотите, но если нужно, чтобы метки проходили от одного конца к другому равномерно (но не обязательно точно), то:

x = c(1:81)
bp <- barplot(x)
axis(side=1,at=bp[1+c(0,20,40,60,80)],labels=c(20,40,60,80,100))

Для меня загадка была в том, почему вы хотели пометить «20» на 0. Но это один из способов сделать это.

...