невозможно изменить символ легенды пузырьковой диаграммы nvd3

В моей пузырьковой диаграмме nvd3 каждая группа точек имеет свой символ, но в легенде все они представлены кружками. Код находится здесь. я только с этим сталкивался

.showLegend(false)

который позволяет скрыть или показать легенду. Я не могу понять, как изменить символы в легенде.


person Dinesh    schedule 25.06.2014    source источник
comment
Прямого подхода к этому нет, вам, возможно, придется настроить исходный файл nvd3.js, чтобы сделать это.   -  person shabeer90    schedule 25.06.2014
comment
@ shabeer90 Не могли бы вы помочь, что именно изменить?   -  person Dinesh    schedule 25.06.2014


Ответы (1)


nvd3 не дает прямого доступа к внутренностям легенды. Однако вы можете довольно легко изменить его, используя выбор d3 для управления его различными частями.

Начните с создания выделения всех элементов с классом nv-series. Этот класс представляет одну группу в легенде, содержащую как символ круга, так и текст (в вашем случае «Group0», «Group1» и т. д.). Это возвращает массив, а первый элемент (индекс 0) представляет собой массив всех элементов:

// all `g` elements with class nv-series
d3.selectAll('.nv-series')[0]

Затем используйте функцию Array.forEach(), чтобы перебрать этот массив, и для каждого элемента замените элемент круга соответствующим символом, соответствующим цветом заливки удаленному кругу.

Для этого вам также необходимо повторно использовать список символов, который вы сделали ранее, и перебирать их, чтобы каждой группе был назначен правильный символ. Вот один из способов сделать это, хотя, возможно, вы можете придумать более простой способ:

// reuse the order of shapes
var shapes = ['circle', 'cross', 'triangle-up', 'triangle-down', 'diamond', 'square'];
// loop through the legend groups
d3.selectAll('.nv-series')[0].forEach(function(d,i) {
  // select the individual group element
  var group = d3.select(d);
  // create another selection for the circle within the group
  var circle = group.select('circle');
  // grab the color used for the circle
  var color = circle.style('fill');
  // remove the circle
  circle.remove();
  // replace the circle with a path
  group.append('path')
    // match the path data to the appropriate symbol
    .attr('d', d3.svg.symbol().type(shapes[i]))
    // make sure the fill color matches the original circle
    .style('fill', color);
});

Вот обновленный JSFiddle.


===== РЕДАКТИРОВАТЬ =====

Я немного просмотрел кодовую базу nvd3, и есть гораздо более простой способ вызвать незаполнение символа легенды, когда он деактивирован. Его можно просто указать в вашем css, поскольку сериалу присваивается класс disabled, когда он отключен.

Если вы добавите следующий css...

.nv-series.disabled path {
    fill-opacity: 0;
}

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

Вот обновленный JSFiddle.

person jshanley    schedule 25.06.2014
comment
Но символ легенды не исчезает при нажатии на него. Как я могу это сделать? - person Dinesh; 26.06.2014
comment
Поскольку обработчик .on('click') уже используется для запуска изменения графика, вы можете использовать .on('mouseup'), чтобы проверить, активна ли группа, и удалить заливку символа. Я понимаю, что это немного хакерски, но на данный момент нет никакого способа обойти это... Вы должны отправить вопрос на их страницу github и сообщить им, что вы хотели бы иметь возможность настроить легенду с помощью разумного API. Вот обновленный на данный момент JSFiddle. - person jshanley; 26.06.2014
comment
Спасибо! Последнее сомнение. Я попытался увеличить символ легенды, используя .attr('r', 10), но размер не меняется. - person Dinesh; 26.06.2014
comment
Эти символы являются элементами path, поэтому у них нет атрибута радиуса, но вы можете настроить их размер и положение с помощью преобразования. Если вы установите .attr('transform', 'scale(1.5)'), символы будут в 1,5 раза больше. Поиграйте с ним, пока не получите то, что вам подходит. Вот обновленный JSFiddle. - person jshanley; 26.06.2014
comment
Спасибо за редактирование. Редактировать - правильное решение. Обработка кликов JavaScript имеет некоторые проблемы, когда мы отключаем все символы в легенде. - person Dinesh; 27.06.2014