Как добавить всплывающие подсказки в geom_abline & geom_hline, используя ggplotly? - PullRequest
0 голосов
/ 28 января 2020

У меня есть набор данных, который выглядит следующим образом:

ID <- paste("S",seq(1, 120, 1), sep="")
Days <- round(rnorm(120, 100, 20), 0)
Sales <- round(rnorm(120, 16, 10), 2)
mult <-round(rnorm(120, 1.4, 0.4), 2)
mult[mult<1] <-1
Items_Sold <- round(Sales*mult, 2)
Items_Sold_Decile <-factor(ntile(Items_Sold, 10))

reprex_plotly <- data.frame(ID, Days, Sales, Items_Sold, Items_Sold_Decile)

И я хочу построить его с помощью ggplot, используя plotly для всплывающих подсказок (чтобы идентификаторы можно было видеть без скучивания графика с метками). Я никогда раньше не использовал сюжеты, и у меня нет знаний о python и минимальных знаниях HTML, но я относительно хорошо знаю ggplot2.

Мой код:

# make colour scale:
red_to_green <- colorRampPalette(c("#800000", "#e6194b", "#f58231", "#ffe119", "#bcf60c", "#3cb44b"))

reprex_plot <- ggplot(reprex_plotly, aes(x=Sales, y=Items_Sold, col=Items_Sold_Decile, size=Days)) +
  #add three ablines to represent 1, 2 and 3 items per sale thresholds:
  geom_abline(slope=1, intercept=0, col="red", linetype="dotted", size=0.7) +
  geom_abline(slope=2, intercept=0, col="orange", linetype="dotted", size=0.7) +
  geom_abline(slope=3, intercept=0, col="green", linetype="dotted", size=0.7) +
  # now add salesperson points:
  geom_point(aes(text=paste(ID, "<br>", "Items Per Sale = ", round(Items_Sold/Sales, 2))), alpha=0.7) +
  # hline for items sold target (12.5 per day):
  geom_hline(yintercept=12.5, linetype="dashed", size=0.5) +
  # theme stuff:
  theme_bw() +
  labs(y="Average Items Sold", x="Average Sales", title = "Salesperson Performance") +
  scale_color_manual(values=c(red_to_green(10))) +
  theme(panel.grid.minor = element_line(colour="lightgrey", size=0.5)) +
  theme(panel.grid.major = element_line(colour="lightgrey", size=0.5)) +
  theme(axis.text.x = element_text(face="bold", size=10)) +
  theme(axis.text.y = element_text(face="bold", size=12)) +
  theme(axis.title.x = element_text(face="bold", size=16)) +
  theme(axis.title.y = element_text(face="bold", size=16)) +
  theme(legend.text= element_text(face="bold", size=12)) +
  theme(legend.title= element_text(face="bold", size=16)) +
  theme(plot.title= element_text(face="bold", size=16, hjust=0.5)) +
  scale_y_continuous(limits=c(0,70), breaks= seq(0,100,10), minor_breaks=seq(0,100,5)) +
  scale_x_continuous(limits=c(0,40), breaks= seq(0,100,2), minor_breaks=seq(0,100,1)) 

ggplotly(reprex_plot)

Кажется, я не могу встроить его сюда, поскольку он продолжает падать, но вот скриншот того, как он выглядит (или вы можете создать его самостоятельно из кода):

screenshot of graph

Это замечательно, но я бы также хотел добавить текстовые всплывающие подсказки на абстракции и хлайне, когда вы наводите на них курсор, например, "Целевые товары, проданные за день = 12,5" или "Предметы на продажу = 2" , Кто-нибудь знает, как добавить это к сюжету?

Кроме того, почему заголовок легенды удаляется от легенды и отсекается от экрана при вызове с помощью ggplotly () по сравнению с ggplot? Как мне предотвратить это?

(Если кто-то может порекомендовать некоторые базовые учебники по ggplotly, предназначенные для людей, знакомых с ggplot, но не заговорщицких, которые также будут очень полезны - все, что я делаю » Мы обнаружили, что до сих пор, похоже, для опытных заговорщиков, пытающихся выучить ggplot!)

1 Ответ

0 голосов
/ 28 января 2020

Я бы рекомендовал попытаться воссоздать сюжет с нуля с помощью функции plot_ly(). Таким образом, вы получаете больше контроля над определенными c элементами вашего графика. Документация - отличное место для начала, вы можете найти веб-сайт здесь: https://plot.ly/r/ и некоторые примеры того, что вы строите здесь: https://plot.ly/r/line-and-scatter/.

Мне удалось получить строки с соответствующими им всплывающими подсказками с помощью:

ggplotly(reprex_plot) %>% 
  add_lines(x = -2:42, y = 12.5, line = list(color = 'black', width = 2, dash = 'dash'), text = "Target items sold per day = 12.5", hoverinfo = 'text', showlegend = FALSE) %>% 
  add_lines(x = -2:42, y = -2:42, line = list(color = 'red', width = 1, dash = 'dash'), text = "Items per Sale = 1", hoverinfo = 'text', showlegend = FALSE) %>% 
  add_lines(x = -2:42, y = c(-2:42)*2, line = list(color = 'orange', width = 1, dash = 'dash'), text = "Items per Sale = 2", hoverinfo = 'text', , showlegend = FALSE) %>% 
  add_lines(x = -2:42, y = c(-2:42)*3, line = list(color = 'green', width = 1, dash = 'dash'), text = "Items per Sale = 3", hoverinfo = 'text', , showlegend = FALSE)

Однако эта реализация не идеальна, поскольку она опирается на исходные строки ggplot (если вы удалите их, это выдаст ошибку). Вот почему я думаю, что лучше строить с plot_ly.

...