2016-05-03 2 views
2

Когда я обрабатываю данные для круговой диаграммы, я объединяю все небольшие значения в «Другое». Графика окрашивается с использованием d3.scale.category20. Как назначить «Другое» конкретному цвету (светло-серый) из набора цветов и присвоить другим значениям, используя метод по умолчанию?d3: присвоение цвета определенному значению

Обновление: Я ищу идиоматическое решение D3, если оно есть. Что-нибудь еще я могу взломать.

+0

Можете ли вы предоставить только ту часть, которая рисует дорожки? Поэтому я могу показать вам, как это сделать. Также, пожалуйста, покажите, как создается «другое». –

+0

Я в значительной степени использую код из [здесь] (https://bl.ocks.org/mbostock/3887235). Кроме того, я изменил переменную цвета на 'd3.scale.category20'. «Другое» вычисляется в python и передается вместе с остальными данными как другая (последняя) строка. –

+0

Я удалил свой ответ, когда это не помогло вам. Как я уже сказал, лучший подход - это просто создать свой собственный порядковый масштаб, определяющий домен. Взгляните на то, что Босток написал здесь: https://groups.google.com/forum/#!msg/d3-js/jsEmhdT9wiU/Xv3Mqql75vYJ –

ответ

0

Создайте свой собственный d3.scale.category20 без серого:

var myCategory20Colors = [ 
    0x1f77b4, 0xaec7e8, 
    0xff7f0e, 0xffbb78, 
    0x2ca02c, 0x98df8a, 
    0xd62728, 0xff9896, 
    0x9467bd, 0xc5b0d5, 
    0x8c564b, 0xc49c94, 
    0xe377c2, 0xf7b6d2, 
    0xbcbd22, 0xdbdb8d, 
    0x17becf, 0x9edae5 
].map(function(x) { 
    var value = x + ""; 
    return d3.rgb(value >> 16, value >> 8 & 0xff, value & 0xff).toString(); 
}); 

var myCategory20 = d3.scale.ordinal().range(myCategory20Colors); 

var original = d3.scale.category20(); 

console.log(original("x"), original("y")); 

console.log(myCategory20("x"), myCategory20("y")); 
// they produce the same result #1f77b4 #aec7e8 

(я удалил 0x7f7f7f, 0xc7c7c7,) из списка, вы можете заменить их своими цветами, а также.

Затем вы можете просто проверить данные при выполнении окраски.

g.append("path") 
     .attr("d", arc) 
     .style("fill", function(d) { 
     if(d.yourRowName == "Other") { 
      return "grey"; 
     } else { 
      return myCategory20(d.data.age); 
     } 
     }); 
+0

Это не сработает, потому что одна из других категорий также будет назначена серой из набора категорий20. –

+0

@DmitryB. отредактирован для решения этой проблемы. – paradite

+0

Прошу прощения, я должен был упомянуть, что я ищу идиоматическое решение D3. У меня уже есть хак на месте :) –

Смежные вопросы