简体   繁体   English

将 geom_line 和 geom_point 与 ggplotly 一起使用时出现奇怪的图例和工具提示文本

[英]Odd legend and tooltip text when using both geom_line and geom_point with ggplotly

I am getting weird elements in my legend and my tooltip text that shows up by hoovering has random lines for color and shape.我的图例中出现了奇怪的元素,并且通过悬停显示的工具提示文本具有随机的颜色和形状线条。

SAMPLE DATA:样本数据:

> dput(sample_n(Plot, 20))
structure(list(Strain = c(0.0099576, 0.00550752, 0.0255111, 0.00341572, 
0.000323357, 0.0036487, 0.0265925, 0.00438567, 0.00437111, 0.0214385, 
0.00957133, 0.00144209, 0.0237199, 0.00290038, 0.00786047, 0.0114374, 
0.000582628, 0.00961509, 0.0110853, 0.00333173), Stress = c(74.4928907635218, 
65.7454752463861, 86.6080612547546, 63.8155559103337, 15.8799350673083, 
63.7937705218785, 76.1766851002328, 64.1491550648465, 64.0561929873925, 
84.7109031517226, 64.7832595395012, 46.2442265654563, 85.8590430135155, 
63.3618876683043, 71.5077936431304, 76.5758067207865, 26.3220708755176, 
74.1047449875333, 76.1658755563428, 63.6570713668388), Instrumentation = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("DIC", "Gauge"), class = "factor"), Bar = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("Spliced", "Unspliced"), class = "factor")), row.names = c(NA, 
-20L), class = "data.frame")

I tried to plot the data by subsetting so I can combine geom_point and geom_line .我尝试通过子集来 plot 数据,以便我可以组合geom_pointgeom_line However, this seemed to have made the legends complicated.然而,这似乎使传说变得复杂。 The colors specified in scale_color_manual only applied to the geom_line so I had to define the color for the points in geom_point and now I am getting extra inputs in the text of the tooptip. scale_color_manual 中指定的scale_color_manual仅适用于geom_line ,因此我必须为 geom_point 中的点定义颜色,现在我在geom_point的文本中获得了额外的输入。

plot <- ggplot(data = subset(Plot, Instrumentation == "DIC"), aes(x = Strain, y = Stress, 
                       colour = Instrumentation, linetype = Bar)) +
 geom_line(size = 0.8) + theme_classic() + 
 geom_point(data = subset(Plot, Instrumentation == "Gauge"), 
            aes(colour = Instrumentation, shape = Bar), colour = "blue", size = 2) +
 labs(x = "Strain (in/in)", y = "Stress (ksi)") + scale_color_manual(values = c("DIC"="red", "LVDT"="blue")) +
 theme_classic() + theme(axis.text =  element_text(color = "black", size = 16), 
       axis.line = element_line(color = "black", size = 0.2), axis.ticks.y = element_line(color = "black", size = 0.2),
       axis.title.y = element_text(color = "black", size = 20, margin = margin(0,40,0,0)), 
       axis.title.x = element_text(color = "black", size = 20, margin = margin(35,0,0,0)),
       legend.title = element_blank(), legend.text = element_text(color = "black", size = 16))

ggplotly(
  p = ggplot2::last_plot(),
  width = NULL,
  height = NULL,
  tooltip = c("Strain","Stress","Instrumentation","Bar"),
  dynamicTicks = FALSE,
  layerData = 1,
  originalData = TRUE,) %>%
  layout(yaxis = list(title = list(text = "Stress (ksi)", standoff = 30L)),
             xaxis = list(title = list(text = "Strain (in/in)",standoff = 30L)),
             legend = list(orientation = "v", x = 0.7, y = 0.13)) 

Screenshot shows how the plot looks with the current code.屏幕截图显示了 plot 与当前代码的外观。 Is there a better way of assigning the colors without messing up the legends?有没有更好的方法来分配 colors 而不会弄乱传说?

在此处输入图像描述

I have used your data as df1 and created 20 more records in df2 .我已将您的数据用作df1并在df2中创建了 20 多条记录。 Then define what should be displayed in tooltip as a text at the beginning.然后在开头将工具提示中应显示的内容定义为text The following code gives the ggplot object.以下代码给出了 ggplot object。

df2 <- df1 %>% mutate(Strain=Strain*10, Stress = 1.2*Stress, Instrumentation = "Gauge")

df <- rbind(df1,df2)
mycolors <- c("red","blue", "green", "orange")
text <- paste("Strain:", df$Stress, "\nStress:", df$Strain, "\nInstrumentation:", df$Instrumentation, "\nBar:", df$Bar)

plot <- ggplot(data = df, aes(x = Strain, y = Stress)) +
  geom_line(size = 0.8, aes(color = Instrumentation, linetype=Instrumentation )) + theme_classic() + 
  geom_point(size=2, aes(color=Bar, shape = Bar, text=text))+ # data = subset(df, Instrumentation == "Gauge"), 
             # aes(colour = Instrumentation, shape = Bar), colour = "blue", size = 2) +
  labs(x = "Strain (in/in)", y = "Stress (ksi)") + 
  scale_color_manual(values = c(mycolors[1:2],mycolors[1:2]) ) + # c("DIC"="red", "LVDT"="blue")) +  # 
  scale_linetype_manual(values = c(1,3)) +
  theme_classic() + theme(axis.text =  element_text(color = "black", size = 16), 
                          axis.line = element_line(color = "black", size = 0.2), axis.ticks.y = element_line(color = "black", size = 0.2),
                          axis.title.y = element_text(color = "black", size = 20, margin = margin(0,40,0,0)), 
                          axis.title.x = element_text(color = "black", size = 20, margin = margin(35,0,0,0)),
                          legend.title = element_blank(), legend.text = element_text(color = "black", size = 12))  +
  guides(linetype = guide_legend(override.aes=list(color=mycolors[1:2], pt.cex=1.5, reverse=T)),  
         shape = guide_legend(override.aes=list(color=mycolors[1:2], lty=0, pt.cex=1.5, reverse=T)), 
         color='none')

plot

输出

If this is the desired output, you can create a plotly object as如果这是所需的 output,您可以将 plotly object 创建为

pp <- ggplotly(plot, tooltip=c("text")) 
pp

输出

Next, to fix the legend labels, it can be hacked as shown below.接下来,要修复图例标签,可以如下所示对其进行黑客攻击。 While this is not an elegant solution, it works.虽然这不是一个优雅的解决方案,但它确实有效。

ins <- unique(df$Instrumentation)
br <- unique(df$Bar)

pp$x$data[[1]]$name <- ins[1]
pp$x$data[[2]]$name <- ins[2]
pp$x$data[[3]]$name <- br[1]
pp$x$data[[4]]$name <- br[2]
pp

输出

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM