我使用ggforce
包中的geom_link2
制作了一个点之间带有渐变线段的ggplot,它完成了我想要的任务:
但是当我通过ggplotly()
传输它时,我收到Warning: geom_GeomPathInterpolate() has yet to be implemented in plotly.
的警告,它打印出来的时候没有这些线。我试着在GitHub上发布这个geom,但是不确定我做的是否正确。有没有其他方法可以在ggplot中生成与ggplot兼容的渐变线/线段?谢谢!
# Practice data
library(ggplot2)
library(plotly)
library(ggforce)
# df
data <- structure(list( Percent = c(0.32, 0.23, 0.75, 0.25, 0.482, 0.421, 0.5114, 0.3423, 0.27, 0.4324, 0.347, 0.377, 0.26,
0.375, 0.18604, 0.241378, 0.3095, 0.348837209, 0.33333, 0.1875, 0.2820, 0.65, 0.72, 0.75, 0.81, 0.87, 0.8244), finalpoint = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, 0.8244), date = structure(c(18262, 18293, 18322, 18353, 18383, 18414, 18444, 18475, 18506, 18536,
18567, 18597, 18628, 18659, 18687, 18718, 18748, 18779, 18809, 18840, 18871, 18901, 18932, 18962, 18993, 19024, 19052), class = "Date"), Status_perc = structure(c(1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), levels = c("<70%", "70-80%", "≥80%"), class = "factor")), row.names = c(NA,
-27L), class = c("tbl_df", "tbl", "data.frame"))
# Create ggplot
test <- data %>%
ggplot( aes ( x = date, y = Percent,
label = finalpoint ,
colour= Percent,
group = 1)) + # Note sure why, but I have to add this
geom_link2( ) +
geom_point ( ) +
geom_text(aes(label = ifelse(is.na(finalpoint), "", sprintf("%1.1f%%",finalpoint*100))) ,
nudge_y = +0.1, nudge_x = -50 ) + # Add label for final point, formatted as %.
scale_y_continuous(limits = c(0,1)) +
scale_colour_gradient2(low = "red", mid = "yellow" , high = "green",
midpoint= 0.70,
limits = c(0,1))
test
test %>% plotly::ggplotly( ) %>%
# tooltip = c("Percent", "edtriage", "Num_Denom" , ")) %>%
config(displayModeBar = F)
1条答案
按热度按时间ulydmbyx1#
我尝试了大量不同的方法来利用
ggplot
。实现这个目标有一些问题。Plotly不支持渐变线。但是,您可以沿着一条线绘制大量的点,并给予其渐变。然而,Plotly会自然地将两个轨迹与具有相同配色方案的点(Plotly中的标记)结合起来,这相当于点的大小相同。
创建和修改
ggplotly
对象的另一个问题是,日期轴转换为ggplot
和Plotly之间的字符串数据。ggplot
必须这样做,因为grid
。而Plotly将日期保留为日期,因为它使用JS。我认为最简单的方法是在这种情况下避免
ggplot
。沿着创建点。
这里有两个函数,一个是求
qty
的中点,第二个是对每个轴调用第一个函数。然后我使用
lapply
循环遍历每一行和前导行,创建一个线段发送给这些函数。因为数据日期是没有时间的
as.Date
,所以数据和newx
都需要转换成等效的时间格式。要在时间轴上有任意多的点,您需要包括时间。当您运行该代码时,它看起来像是在您的时区中。但是,当Plotly运行它时,它将以UTC运行。换句话说,日期将完全按照您最初定义的方式显示。
是时候开始谋划了。
对于第一个图,我们将使用
data3
。在图中,geom_point
等于type = "scatter", mode = "markers"
。我们将使用coloraxis
,这样图中的所有数据都使用相同的配色方案。此外,由于您将有悬停内容,我在
hovertemplate
中将百分比格式化为百分比。我们将添加单个标签或
annotation
,而不是将您的标签称为它自己的图层(ggplot
)或轨迹(plotly
)。我们将定义x轴的范围,因为我们使用了
POSIX
。因为我们在plot_ly
的调用中设置了coloraxis
,所以我们必须定义它在layout
中的含义。我使用了调色板"Hot"
,但您可以使用任何调色板。此外,我对colorbar
应用了一些设置,以便它与ggplot
中的外观更接近。接下来,我们将绘制将替换直线的点。我们仍然需要分配
coloraxis
,但根本不需要分配layout
。当我们合并这两个图时,我们将使用第一个图中的布局。由于
fig
中的点是相关点,因此我已经从该图中删除了悬停数据。这些图需要是完整的Plotly对象,这样我们就可以从
fig2
中提取数据并将其放入fig
中。