Прямые метки за пределами области построения / Отключить автоматическое изменение размера прямых меток

Пакет «directlabels», по-видимому, по умолчанию пытается поместить каждую метку в нормальную область рисования, уменьшая размер шрифта метки.

Ниже Label for One, Label for Two и Label for Threeeeeeeeee все должны иметь одинаковый размер шрифта, и это нормально, если метки выходят за пределы области построения (поскольку clip отключен для отображения пользовательских аннотаций).

Фактически, я мог бы захотеть установить xlim=c(1,3), и метки должны быть полностью вне области построения. Левый столбец изображений ниже соответствует xlim=c(1,3.4), правый столбец — xlim=c(1,3).

Я узнал, что cex можно использовать для сброса размера шрифта метки, но, похоже, это противоречит алгоритму разделения меток пакета. Верхний ряд изображений ниже не соответствует cex, нижний ряд — cex=1.

Было бы здорово найти способ, чтобы метки не перекрывались, имели одинаковый размер шрифта, и это работало бы с xlim=c(1,3) и xlim=c(1,3.4).

введите здесь описание изображения

library(reshape)
library(ggplot2)
library(directlabels)

df=data.frame(
  x = 1:3,
  One=c(12, 8, 13),
  Two=c(13, 7, 11),
  Threeeeeeeeee=c(11, 9, 11))

df.d.melt = melt(df[,c("x","One","Two","Threeeeeeeeee")], id.vars="x")
df.d.melt$variable1 = df.d.melt$variable
levels(df.d.melt$variable1) = paste("","Lable for",levels(df.d.melt$variable1))

p = ggplot(df.d.melt, aes(x=x, y=value, color=variable)) + 
  geom_line(size=1.1) +
  geom_text(aes(x =3.4, y=8, label="Custom Outside\nChart Annotation"), show_guide=FALSE) + 
  coord_cartesian(xlim=c(1,3.4)) +
  geom_dl(aes(label=variable1), method=list("last.qp", cex=1), show_guide=FALSE) + 
  theme(legend.position="top",plot.margin = unit(c(0, 4, 0, 0), "cm")) 

p1 <- ggplot_gtable(ggplot_build(p))
p1$layout$clip[p1$layout$name=="panel"] <- "off"
grid.draw(p1)

person st12    schedule 12.12.2012    source источник
comment
сюжет вопроса сбивает с толку. Код, который вы даете, не для граненого сюжета. Не могли бы вы отредактировать свой вопрос и уточнить окончательный желаемый сюжет?   -  person agstudy    schedule 12.12.2012
comment
@agstudy: это было склеено в MSPaint. Извините, давно не делал фасетные сюжеты. Показанный код относится к диаграмме внизу слева.   -  person st12    schedule 12.12.2012


Ответы (2)


По умолчанию directlabels предполагает, что вы хотите иметь читаемые метки ВНУТРИ области построения, поэтому он уменьшает размер текста, чтобы метка помещалась внутри, используя reduce.cex.lr. Метки за пределами графика могут быть выполнены путем определения пользовательского метода позиционирования, который не уменьшает размер текста, например.

do.not.reduce <-
  list(cex=2, "last.points", "calc.boxes",
       qp.labels("y", "bottom", "top", make.tiebreaker("x", "y")))

WithLegend <- ggplot(df.d.melt, aes(x=x, y=value, color=variable)) + 
  geom_line(size=1.1) +
  geom_text(aes(x =3.4, y=8, label="Custom Outside\nChart Annotation")) + 
  coord_cartesian(xlim=c(1,3)) +
  theme(plot.margin = unit(c(0, 4, 0, 0), "cm"))
WithLabels <- direct.label(WithLegend, "do.not.reduce")
GTable <- ggplot_gtable(ggplot_build(WithLabels))
GTable$layout$clip[GTable$layout$name=="panel"] <- "off"
grid.draw(GTable)
person Toby Dylan Hocking    schedule 13.11.2013

Рабочее решение состоит в том, чтобы прикрепить метки к дополнительным невидимым коротким линиям в левой части диаграммы (например, определенным от x=1 до x=1.001) и использовать trans_new прямых меток для перемещения аннотаций к желаемому значению x.

person st12    schedule 14.12.2012