Настройка всплывающей подсказки в древовидной карте с помощью R и googleVis

Мне нужно, чтобы пользовательская всплывающая подсказка отображалась, когда пользователь наводит курсор на квадрат на карте дерева, и я использую эта статья в качестве основы.

Карта дерева должна быть построена с помощью библиотеки R и googleVis с использованием функции gvisTreeMap(). Согласно упомянутой статье я создал параметр generateTooltip в списке опций функции и присвоил ему код для создания анонимной функции. Вот завершенный код для вызова gvisTreeMap():

plot(gvisTreeMap(Data,
    idvar="Name.of.the.Company",
    parentvar="Name.of.the.Parent",
    sizevar="Loan.Size..INR.in.million.",
    options=list(width='*', 
        height=600, 
        minColorValue=0, 
        maxColorValue=0, 
        generateTooltip = "function(row, size, value) { 
                              return '<div style=\"background:#fd9; padding:10px; border-style:solid\">' + 'Some text' + '</div>'; 
                           }"
)))

Результирующий JS-код на моей HTML-странице выглядит так:

// jsDrawChart
...
var options = {};
options["height"] = 600;
options["minColorValue"] = 0;
options["maxColorValue"] = 0;
options["generateTooltip"] = "function(row, size, value) { return '<div style=\"background:#fd9; padding:10px; border-style:solid\">' + 'Some text' + '</div>'; }";

Здесь options["generateTooltip"] инициализируется строкой, которая вызывает ошибку (хотя я ожидал, что строка будет автоматически распознана как определение функции). Итак, я хотел бы знать, есть ли способы передать определение функции из среды R в свойство generateTooltip?


person Mstislav Toivonen    schedule 21.08.2015    source источник


Ответы (2)


Я знаю, что это сообщение больше года назад ... но, хотя сегодня я имел дело с точно такой же проблемой, я не мог найти конкретного решения нигде, поэтому я подумал, что поделюсь своим решением в надежде, что кто-нибудь найдет это пригодится в будущем.

На самом деле я использовал ваш пост, Мстислав, как отправную точку, но столкнулся с той же проблемой, пытаясь назначить функцию JavaScript в списке параметров. После нескольких безуспешных попыток удалить кавычки (мне удалось удалить кавычки с помощью as.symbol() и unquote(), но после передачи результата в gvisTreeMap появились сообщения об ошибках), я понял, что суть проблемы заключается в том, что в документации Google Charts предполагается, что вы пишете код непосредственно в JavaScript, в то время как вы фактически вводите аргументы в функции R, которые затем переводят их в JavaScript.

Поскольку, похоже, не существует простого способа передать функцию JavaScript в вызов функции gvisTreeMap, я решил попытаться определить, где в исходном коде googleVis этот список параметров переводится в JavaScript, а затем изменить Javascript непосредственно в соответствии со статьей. .

После загрузки исходного кода googleVis и обратного отслеживания из gvisTreeMap (в gvisTreeMap.R) я нашел фрагмент кода, который мне нужно было изменить в gvis.R:

jsDrawChart <- '
// jsDrawChart

// ** begin modified portion **//
function showFullTooltip(row, size, value) {
return \'<div style="background:#fd9; padding:10px; border-style:solid">\' +
\'Group: \' + row + \'<br>\' +
\'Headcount: \' + size + \'<br>\' +
\'Turnover Rate: \' + value + \' </div>\';
}
// ** end modified portion **//

function drawChart%s() {
var data = gvisData%s();
var options = {};
%s
// ** begin modified portion **//
options["generateTooltip"] = showFullTooltip;
// ** end modified portion **//
%s
%s
%s
}
%s  
'
jsDrawChart <- sprintf(jsDrawChart, chartid,  chartid,
                       paste(gvisOptions(options), collapse="\n"),
                       jsFormats,
                       gvisNewChart(chartid,type,options),
                       gvisListener(chartid, type, options),
                       gvisEditor(chartid,type,options)
)

Я модифицировал две части (обернутые в //** начало/конец модифицированной части **//). Первая часть определяет функцию showFullTooltip, а вторая часть добавляет параметр generateTooltip в список параметров. Это сработало для меня как шарм. Статья Google Charts очень помогла в описании того, как изменить код JavaScript. Хитрость заключается в том, чтобы просто выяснить, ГДЕ найти этот фрагмент кода в программах googleVis.

Я обнаружил, что для запуска этого кода вам не нужно «переопределять» пакет googleVis. Вам просто нужно сохранить копию модифицированного gvis.R и немодифицированного gvisTreeMap.R в папке вашего проекта (или в любом доступном вам месте). Затем в верхней части программы загрузите библиотеку googleVis (чтобы у вас были все зависимости), а затем загрузите свои версии gvis.R и gvisTreeMap.R (именно в таком порядке). Измененные версии функций googleVis будут переопределять те, которые вы загрузили из библиотеки googleVis.

person xxk    schedule 19.12.2016

У меня была та же проблема, и ответ xxk частично помог мне, за исключением моего случая, я хотел объедините обе всплывающие подсказки по умолчанию (только с именем прямоугольника - очень полезно включать, когда у вас есть несколько крошечных областей на графике), с дополнительными деталями из showFullTooltip (т. е. значение и размер). Чтобы это стало возможным, вам необходимо (в основном) выполнить те же шаги, которые предложены xxk, т. е.

  • скачивание исходного кода googleVis
  • извлечение и сохранение gvis.R и gvisTreeMap.R в подходящем месте
  • редактирование только gvis.R (1) и его сохранение
  • загрузка любых других пакетов R, которые могут вам потребоваться, включая googleVis (2)
  • только затем вставьте свои пользовательские gvis.R и gvisTreeMap.R в свой основной скрипт (в таком порядке).

Теперь необходимо несколько отклонений от описанного выше подхода, который я отметил скобками:

(1) В gvis.R нужно быть осторожным при размещении функции showFullTooltip из-за некоторых проблем с областью действия. Лучшее место находится в объявлении для gvisNewChart. После редактирования это будет выглядеть так, как показано ниже. Обратите также внимание, что row из решения xxk было заменено на data.getValue(row, 0), также известное как метка прямоугольника:

gvisNewChart <- function(chartid,type,options){

  ret <- ""
  if(is.null(options$gvis$gvis.editor)){
    jsnewchart <- "
    var chart = new google.visualization.%s(
    document.getElementById(\'%s\')
    );

    // ** begin modified portion **//
    function showFullTooltip(row, size, value) {
    return \'<div style=\"background:#fd9; padding:10px; border-style:solid\">\' +
    \'Name: \' + data.getValue(row, 0) + \'<br>\' +
    \'Average: \' + size + \'<br>\' +
    \'Normalised: \' + value + \' </div>\';
    }
    // ** end modified portion **//

    chart.draw(data,options);"
    ret <- sprintf(jsnewchart,type,chartid)  

  } else {
    jsnewchart <- "
    chart%s = new google.visualization.ChartWrapper({
    dataTable: data,       
    chartType: '%s',
    containerId: '%s',
    options: options
    });
    chart%s.draw();
    "
    ret <- sprintf(jsnewchart,chartid,type,chartid,chartid)
  }
  ret
  } 

(2) Мне также нужно было загрузить library(jsonlite) в мой основной R-скрипт, чтобы все это работало.


И еще кое-что. Вам не нужно делать ничего особенного в вызове R для gvisTreeMap(). Всплывающие подсказки теперь будут вести себя так, как предполагалось «по умолчанию». Например, сейчас:

gvisTreeMap( nested_data, idvar = "Child", parentvar = "Parent",
             sizevar = "Value", colorvar = "Value",
             options = list(
               minColorValue = 0, 
               maxColorValue = 100,
               minColor = 'green',
               midColor = '#fff',
               maxColor = 'red',
               showScale = TRUE,
               maxDepth = 2,
               width = "100%", height = 800             
             )

должен просто создавать подробные всплывающие подсказки самостоятельно, без указания этого поведения.

Мне посчастливилось иметь рядом замечательных людей, которые помогали мне в этом, так как я не мог справиться сам. Так что спасибо @DavidFarrell и @RossAnderson.

person LexConstantine    schedule 15.08.2018