2014-11-10 2 views
1

Я пытаюсь создать горизонтальную гистограмму с метками категории с помощью ggplot.позиционирующие метки на geom_bar

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

Следующие, что я пробовал до сих пор.

данные

dt1 <- data.table(x=c("a","b","c","d","e"), y=c(43,52,296,102,157), y2=c(50,10,100,45,80)) 

Диаграмма 1

ggplot() + geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") + coord_flip() + 
    geom_text(data=dt1, aes(x=x, y=y, label=paste0("$",y," from ",y2," records")),hjust=0) 

Как вы можете видеть ниже метки оборванны. Chart 1

Диаграмма 2

Затем я наткнулся на эту question, который был полезным и заставил меня понять, что я установить положение метки на основе моей переменной у, так что я жёстко его сейчас и использовать hjust раздуть это от оси.

ggplot() + geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") + coord_flip() + 
    geom_text(data=dt1, aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust=-0.1) 

Но вы можете увидеть ниже, что только 2 из лейблов вписываться в баре, так что я предпочел бы, чтобы другие были помещены в конце концов, на внешней стороне панели, как в таблице 1. chart 2

Есть ли программный способ получить лучшее из обоих миров из графика 1 и диаграммы 2?

ответ

0

Я буду неправильно программировать как «прагматичный». Добавление «+ scale_y_continuous (пределы = c (0, max (dt1 $ y) +100))» создало достаточное пространство для ярлыков. Мне не хватает репутации, чтобы загрузить сюжет.

ggplot() + geom_bar(data=dt1, aes(x=x, y=y), stat="identity",fill="red") + coord_flip() + geom_text(data=dt1, aes(x=x, y=y, label=paste0("$",y," from ",y2," records")),hjust=0) + scale_y_continuous(limits=c(0,max(dt1$y)+100)) 

Редактировать 2; Я изменил код, чтобы получить максимальное значение и добавить к нему 100. По-прежнему не подходит сюжет для включения текста, но он будет работать с фиксированными метками.

+0

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

1

Это один из способов. Это немного длинный подход, но вы можете подмножить свои данные для geom_text. Таким образом, вы можете вручную назначить позицию, которую вы хотите для каждого бара.

ggplot() + 
geom_bar(data = dt1, aes(x=x, y=y), stat="identity",fill="red") + 
coord_flip() + 
geom_text(data = filter(dt1, x == "e" | x == "c"), 
    aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = -0.1) + 
geom_text(data = filter(dt1, x == "d"), 
    aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = - 1.1) + 
geom_text(data = filter(dt1, x == "b"), 
    aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = - 0.6) + 
geom_text(data = filter(dt1, x == "a"), 
    aes(x=x, y=0, label=paste0("$",y," from ",y2," records")),hjust = - 0.5) 

enter image description here

+1

Было бы больно настраивать вручную и относительно положение меток подлежат отображению. – KFB

+0

@KFB Да, я знаю, что вы имеете в виду. Если графика такая, я бы не прочь сделать ручную работу. Но если у кого-то большое количество групп, он должен думать о чем-то другом. – jazzurro

+0

Я думал, что это может быть несколько сложно. До сих пор я считаю, что диаграмма 2 в моем вопросе будет лучшим способом избежать ручного вмешательства для сюжетов. – Dan

Смежные вопросы