Повернуть метки оси X на заданный градус для прямоугольной диаграммы в R - PullRequest
1 голос
/ 08 мая 2020

Я создаю коробчатую диаграмму с кодом ниже:

boxplot(top10threads$affect ~ top10threads$ThreadID[], data = top10threads, xlab = "10 biggest Threads", ylab = "Affect", col=(c("gold","darkgreen")), srt=45)

Но, как вы можете заметить, некоторые метки на оси x отсутствуют, поэтому я хочу повернуть их на 45 градусов. Я добавил srt=45, но это не работает.

Установив las=2 могу повернуть их по вертикали, но это не совсем мне нужно.

Как я мог это сделать? Спасибо.

enter image description here

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Сначала сохраните вывод boxplot() как объект. Он содержит названия групп. Вы можете использовать $names, чтобы получить их. Затем используйте text(), чтобы добавить метки оси. Аргумент srt работает с text().

tmp <- boxplot(y ~ x, data = df, col = c("gold","darkgreen"), xaxt = "n")
tick <- seq_along(tmp$names)
axis(1, at = tick, labels = F)
text(tick, par("usr")[3] - 0.3, tmp$names, srt = 45, xpd = T)


Данные

df <- data.frame(x = sample(100:110, 100, T), y = rnorm(100))
1 голос
/ 08 мая 2020

Некоторые тестовые данные:

mydata=lapply(1:5,function(i) rnorm(100,mean=i))
names(mydata)=c("first","second","third","fourth","fifth")

Сначала постройте коробчатую диаграмму без оси x:

boxplot(mydata,xaxt="n",xlab="")

Затем мы создаем функцию для добавления текстовых меток оси x:

x_axis_labels=function(labels,every_nth=1,...) {
    axis(side=1,at=seq_along(labels),labels=F)
    text(x=(seq_along(labels))[seq_len(every_nth)==1],
        y=par("usr")[3]-0.075*(par("usr")[4]-par("usr")[3]),
        labels=labels[seq_len(every_nth)==1],xpd=TRUE,...)
}
# axis() draws the axis with ticks at positions specified by at.  Again, we don't plot the labels yet.
# text() plots the labels at positions given by x and y.
# We estimate the y-positions from the values of the y-axis (using par("usr")),
# and specify xpd=TRUE to indicate that we don't want to crop plotting to within the plot area
# Note that we select the [seq_len(every_nth)==1] elements of both the x positions and the labels, 
# so we can easily skip labels if there would be too many to cram in otherwise.  
# Finally, we leave a ... in the function so we can pass additional arguments to text()

Наконец, мы вызываем новую функцию для построения меток отметок оси:

x_axis_labels(labels=names(mydata),every_nth=1,adj=1,srt=45)

Здесь мы используем ... в функции для передачи поворота / выравнивания параметры: adj = 1 указывает выравнивание текстовых меток по правому краю, а srt = 45 указывает их поворот на 45 градусов.

...