R Нарисуйте все метки осей (не допускайте пропуска некоторых) - PullRequest
13 голосов
/ 31 декабря 2011

Когда я вручную добавляю следующие метки с помощью (axis(1, at=1:27, labels=labs[0:27])):

> labs[0:27]
 [1] "0\n9.3%"  "1\n7.6%"  "2\n5.6%"  "3\n5.1%"  "4\n5.7%"  "5\n6.5%"  "6\n7.3%"  "7\n7.6%"  "8\n7.5%"  "9\n7%"    "10\n6.2%" "11\n5.2%"
[13] "12\n4.2%" ........

, я получаю следующее:

enter image description here

Как заставитьвсе метки должны быть нарисованы так, 1,3,5,6 и 11 не пропущены?(также, для дополнительного кредита, как мне сдвинуть все это на несколько пикселей?)

Ответы [ 5 ]

18 голосов
/ 03 июля 2012

Если вы действительно хотите, чтобы все метки отображались, даже если они очень близки или перекрываются, вы можете «обмануть» R, чтобы отобразить их, добавив метки нечетной и четной оси отдельными командами, как показано ниже:

labs <-c("0\n9.3%","1\n7.6%","2\n5.6%","3\n5.1%","4\n5.7%","5\n6.5%","6\n7.3%",
         "7\n7.6%","8\n7.5%","9\n7%", "10\n6.2%","11\n5.2%","12\n4.2%",13:27)
n=length(labs)
plot(1:28, xaxt = "n")
axis(side=1, at=seq(1,n,2), labels=labs[seq(1,n,2)], cex.axis=0.6)
axis(side=1, at=seq(2,n,2), labels=labs[seq(2,n,2)], cex.axis=0.6)

enter image description here

Вы можете поиграть с cex.axis, чтобы получить нужный размер текста.Также обратите внимание, что вам может потребоваться настроить количество значений в at= и / или labels=, чтобы они были равны.

Я согласен с @PLapointe и @joran, что, как правило, лучше не вмешиваться в поведение R по умолчанию в отношении перекрытия.Тем не менее, у меня было несколько случаев, когда метки осей выглядели нормально, даже если они не были полностью разделены на «м-ширину», и я наткнулся на хитрость чередования нечетных и четных меток, чтобы получить поведение, которое яв розыске.

13 голосов
/ 31 декабря 2011
Ось

? Говорит вам, что:

Код изо всех сил старается не рисовать перекрывающиеся метки тиков и поэтому пропускает метки там, где они будут прилегать или перекрывать ранее нарисованные метки.Это может привести, например, к метке каждого другого тика.(Галочки отображаются слева направо или снизу вверх, и между метками остается пробел, по крайней мере, размером «м».)

Поиграйте с cex.axis, чтобы метки были достаточно маленькимичтобы соответствовать без наложения

labs <-c("0\n9.3%","1\n7.6%","2\n5.6%","3\n5.1%","4\n5.7%","5\n6.5%","6\n7.3%",
         "7\n7.6%","8\n7.5%","9\n7%", "10\n6.2%","11\n5.2%","12\n4.2%",12:27)
plot(1:27,xaxt = "n")
axis(side=1, at=1:27, labels=labs[0:27],cex.axis=0.35)

Если вы расширяете график (вручную, перетаскивая или программно), вы можете увеличить размер ваших меток.

3 голосов
/ 20 октября 2015

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

Вот еще одно решение. Нарисуйте график без оси, затем добавьте галочки с пустыми метками. Сохраните положения галочек на объекте, чтобы затем можно было просмотреть каждый из них и разместить его в правильном положении на оси.

plot(1:10, 1:10, yaxt = "n") axis_ticks = axis(2, axTicks(2), labels = rep("", length(axTicks(2)))) for(i in axis_ticks) axis(2, i)

3 голосов
/ 31 декабря 2011

@ PLapointe только что опубликовал то, что я собирался сказать, но пропустил бонусный ответ.

Установите padj = 0.5 в axis, чтобы немного переместить метки вниз.

0 голосов
/ 22 января 2016

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

xaxis_stagger = function(positions,labels) {
  odd=labels[seq(1,length(labels),2)]
  odd_pos=positions[seq(1,length(positions),2)]
  even=labels[seq(2,length(labels),2)]  
  even_pos=positions[seq(2,length(positions),2)]
  axis(side=1,at=odd_pos,labels=odd)
  axis(side=1,at=even_pos,labels=even,padj=1.5)
}

Таким образом, вы задаете позиции, в которых вы хотите, чтобы метки были, и метки для этих галочек, и тогда это реорганизовало бы его в два набора осей и наносило их на исходный график. Исходный сюжет будет сделан с xaxt = "n".

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