Plotly标记显示在条形图中

时间:2016-10-06 14:47:24

标签: r plotly

我是个新手,想要制作我自己的子弹图(有点像http://bl.ocks.org/mbostock/4061961),它有标记/痕迹,用于在比较实际值与预期值时显示相关值的值。

以下是我的尝试:

q <- ggplot(data.frame(measure='',actual=25),aes(x=measure,y=actual))+
  geom_bar(stat='identity')+
  ylim(c(0,35))+
  geom_hline(yintercept = 30,color='red')+
  geom_text(y=30,label='Expected',angle=270,vjust=0)+
  coord_flip()+
  ylab('Num. of carrots')
q
q1 <- ggplotly(q) %>% add_markers()
q1

使用ggplotly将其转换为情节时,文本看起来没有正确旋转,并且条形图中没有显示标记/迹线...这里的任何帮助都将非常感激。

最诚挚的问候,

HLM

1 个答案:

答案 0 :(得分:2)

我认为这种情况并不支持旋转文本类型=&#34; scatter&#34; (这就是ggplotly如何解释你的geom_text)。您可以从ggplot图中删除geom_text行,然后使用注释将文本添加到图表中:

q1 <- ggplotly(q) %>% add_markers() %>%
  layout(annotations = list(x = 30, y = 1,  text = "Expected", textangle=270))
q1

enter image description here

更新

问题的第二部分(如何在栏上获得悬停信息)稍微复杂一些。要获取悬停信息,我们可以直接使用plotly API创建条形

p.bars = plot_ly(data = data.frame(measure='', actual=25)) %>% 
           add_bars(y=~measure, x=~actual, orientation="h")

我们可以像这样添加文本注释

p.bars.text = p.bars %>% 
              layout(annotations = list(x = 30, y = 0,  text = "Expected", textangle=270, 
                     showarrow=F, xanchor="center"))

但问题是通过

在该图中添加一条线
 p.bars.text %>% add_segments(x=30, xend=30, y=-0.5, yend=0.5) 

给出错误

  

populate_categorical_axes(p)中的错误:无法显示离散和&amp;同一轴上的非离散数据

即。我们只能根据y的分类值指定线的y值。所以,例如我们可以做到

dat1 = data.frame(measure=letters[1:2], actual=c(25,20))
plot_ly(data = dat1) %>% 
  add_bars(y=~measure, x=~actual, orientation="h") %>%
  layout(annotations = list(x = 29, y = 0,  text = "Expected", textangle=270, 
                            showarrow=F, xanchor="center")) %>%
  add_segments(x=30, xend=30, y='a', yend='b') 

给出以下内容,其中行与类别标签对齐,而不是与条的宽度

对齐

enter image description here

目前我唯一能解决的问题是对类别使用数字轴,然后使用ticktext设置轴标签:

plot_ly(data = data.frame(measure=c(0,1), actual=c(25,20))) %>% 
  add_bars(y=~measure, x=~actual, orientation="h", showlegend=F) %>%
  add_segments(x=30, xend=30, y=-0.4, yend=0.4, showlegend=F)  %>%
  layout(annotations = list(x = 29.5, y = 0,  text = "Expected", textangle=270, showarrow=F, xanchor="center"),
         yaxis = list(tickmode="array", tickvals=c(0,1), ticktext=c("", "") )) 

enter image description here