一段时间以来,我一直在与一个特定的问题作斗争,而Stackoverflow上现有的(非常相似的)答案都无法让我到达需要的位置。
我只是想将字符串变量作为其他数据添加到高图散点图中的工具提示中。我想要的东西与此问题类似:Additional data to highcharter tooltip
我已经对该问题的代码进行了一些修改,以创建一个可行的示例。问题是我似乎无法在工具提示中显示字符串变量(如果它们是因素,则将其解析为数字)。
library("dplyr")
library("highcharter")
data<- data.frame(Company = c("A", "A", "A", "B", "B", "B"),
Country = as.vector(c("A", "D", "F", "B", "B", "B")),
Year = c(1,2,3,1,2,3),
Value1 = c(100, 150, 170, 160, 150, 180),
Value2 = c("hi", 1, 7, 6, 5, 4), stringsAsFactors = FALSE)
data<- data %>%
group_by(name = Company) %>%
do(data = .$Value1, Value2 = .$Value2, Country = .$Country)
series<- list_parse(data)
highchart()%>%
hc_chart(type="scatter")%>%
hc_add_series_list(series)%>%
hc_tooltip(formatter= JS("function () { return 'Company: ' +
this.series.name + ' <br /> Value1: ' + this.point.y +
'<br /> Country: ' + this.point.Country ;}"))
当我尝试添加“ this.point.Country”时,这只是产生未定义的工具提示。
我还发现了这一点:R Highcharter: tooltip customization
建议将工具提示定制作为系列的一部分。但是,当我这样做时,当我将字符串变量传递给系列时,绘图似乎完全失败。例如,这有效,并且还允许我将z变量传递到工具提示中:
Errors <- data.frame(Average_R = c(90,100,110,131),
Minimum_R = c(50, 30, 45, 65),
Plant_name = c("Place","holder","name","here"),
stringsAsFactors = F)
highchart() %>%
hc_plotOptions(scatter = list(
dataLabels = list(enabled = F),
enableMouseTracking = TRUE
)
) %>%
hc_series(
list(type = "scatter",
name = pollutant,
data = Map(c,y = round(Errors$Average_R,2), z = Errors$Minimum_R))
) %>%
hc_tooltip(formatter = JS(paste0('function() {
return "<span style=\'color:" + this.point.color + "\'>\u25CF</span> " + this.series.name + " : <b>" + this.point.y + "</b> " + this.point.z + "<br/>";
}')))
结果(没有足够的代表来发布直接图像)
但是当我将hc_series的data参数中的z变量更改为字符串变量Plant_name时,整个绘图都会失败。
有人对如何解决这个问题有想法吗?
答案 0 :(得分:0)
根据Set Additional Data to highcharts series在Nick的回答,这实际上是数据表示的问题,请看一下他在https://jsfiddle.net/burwelldesigns/jeoL5y7s/的小提琴
基本上,该系列应该是一个嵌套列表,您要使用的所有内容都应位于data
您可能想找到一种更有效的方式来定义系列,但最终应该是这样的:
df <- data_frame(name = c('A', 'B'))
df$data <- list(
list(
list(y = 100, Country = "A"),
list(y = 150, Country = "D"),
list(y = 170, Country = "F")),
list(
list(y = 160, Country = "B"),
list(y = 150, Country = "B"),
list(y = 180, Country = "B")))
series <- list_parse(df)
然后输入您的高级图表代码
highchart()%>%
hc_chart(type="scatter")%>%
hc_add_series_list(series)%>%
hc_tooltip(formatter= JS("function () { return 'Company: ' +
this.series.name + ' <br /> Value1: ' + this.point.y +
'<br /> Country: ' + this.point.Country ;}"))
更新:用户可以使用lapply
来获取所需的嵌套列表,例如以下适用于数据的内容:
请注意:
我使用data_0
而不是data
来避免混乱
我将列Value1
的名称更改为y
,以使highchart正常工作
如果需要,您还可以定义x
列(尝试取消注释我在示例中添加的x
列)
。
data_0 <- data.frame(Company = c("A", "A", "A", "B", "B", "B"),
Country = as.vector(c("A", "D", "F", "B", "B", "B")),
Year = c(1,2,3,1,2,3),
y = c(100, 150, 170, 160, 150, 180),
# x = c(0, 1, 7, 6, 5, 4),
Value2 = c('hi', 1, 7, 6, 5, 4), stringsAsFactors = FALSE)
# use the unique group values as names for the lists
df <- data_frame(name = unique(data_0$Company))
# use nested lapplys to get nested lists
df$data <- lapply(df$name, # for each group name
function(x, data_orig, cols){
temp_df <- data_orig[data_orig$Company==x, cols] # get the data that belongs to this group
lapply(1:nrow(temp_df),
function(i){
as.list(temp_df[i,])} # make it a list
)},
data_orig = data_0, cols = c(2:5))
series <- list_parse(df)