Создайте частичную пунктирную линию в ggplot2

Я создаю график в R и вам нужно создать строку, в которой некоторые из значений являются проекциями. Проекции представлены как пунктирная линия. Здесь код:

df = data.frame(date=c(rep(2008:2013, by=1)),
                value=c(303,407,538,696,881,1094))


ggplot(df, aes(date, value, width=0.64)) + 
        geom_bar(stat = "identity", fill="#336699", colour="black") +
        ylim(c(0,1400)) + opts(title="U.S. Smartphone Users") +
        opts(axis.text.y=theme_text(family="sans", face="bold")) +
        opts(axis.text.x=theme_text(family="sans", face="bold")) +
        opts(plot.title = theme_text(size=14, face="bold")) +
        xlab("Year") + ylab("Users (in millions)") +        
        opts(axis.title.x=theme_text(family="sans")) +
        opts(axis.title.y=theme_text(family="sans", angle=90)) +
        geom_segment(aes(x=2007.6, xend=2013, y=550, yend=1350), arrow=arrow(length=unit(0.4,"cm")))

Итак, я создал строку, которая простирается с 2008 по 2013 год. Тем не менее, я хочу сплошную линию с 2008 по 2011 год и пунктирную линию с 2011 года до конца. Я просто делаю два отдельных сегмента линии, или есть отдельная команда, которую я могу использовать для получения желаемого результата.

Ответ 1

Философия ggplot проста. Каждый элемент сюжета должен находиться на другом уровне. Таким образом, для получения двух сегментов линии в разных типах строк вам нужно два оператора geom_segment.

Я иллюстрирую тот же принцип с geom_bar в разных цветах для разных периодов.

ggplot(df[df$date<=2011, ], aes(date, value, width=0.64)) + 
    geom_bar(stat = "identity", fill="#336699", colour="black") +
    geom_bar(data=df[df$date>2011, ], aes(date, value),  
        stat = "identity", fill="#336699", colour="black", alpha=0.5) +
    ylim(c(0,1400)) + opts(title="U.S. Smartphone Users") +
    opts(
        axis.text.y=theme_text(family="sans", face="bold"), 
        axis.text.x=theme_text(family="sans", face="bold"), 
        plot.title = theme_text(size=14, face="bold"), 
        axis.title.x=theme_text(family="sans"), 
        axis.title.y=theme_text(family="sans", angle=90)
    ) +
    xlab("Year") + ylab("Users (in millions)") +        
    geom_segment(aes(x=2007.6, xend=2011, y=550, yend=1050), linetype=1) + 
    geom_segment(aes(x=2011, xend=2013, y=1050, yend=1350), 
        arrow=arrow(length=unit(0.4,"cm")), linetype=2) 

enter image description here