Короче говоря, вам нужно очистить ваши данные.
Длинный ответ:
Ваши данные не соответствуют формату?
1006 *
Вы должны иметь числовое значение «продажи» для каждой строки?
Почему у некоторых есть то, что кажется быть 2 подкатегориями?
Это плохое форматирование с использованием запятой в названии подкатегории, например "Стулья, закругленные спины"?
Как это нужно исправить, чтобы работа.
Посмотрите на пример, который я дал вам в качестве ответа ({ ссылка }) на ваш предыдущий вопрос: https://vizhub.com/Alex-ley/1ebd1b410b994ce1ad4e754bd7ebf89a?edit=files&file=items1%283%29.csv
Файл .csv имеет хороший формат:
И обратите внимание, что в нем есть столбец total_items
. Это необходимо.
Я использовал этот код VBA для очистки ваших данных (укажите заполнитель 123
значение):
Sub reformat()
For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row
'Cells(i, 4).Select
If Len(CStr(Val(Cells(i, 4)))) <> Len(Cells(i, 4)) Then
Cells(i, 3) = Cells(i, 3) & ";" & Cells(i, 4)
Cells(i, 4) = 123
End If
Next
End Sub
И затем я добавил Sales_totals с помощью:
Sub add_totals()
'need reference to Microsoft Scripting Runtime (or late binding)
Dim dict As New Dictionary
For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row
'Cells(i, 4).Select
trimmed = Trim(Cells(i, 2))
If dict.Exists(trimmed) Then
dict(trimmed) = dict(trimmed) + Cells(i, 4)
Else
'new key
dict.Add trimmed, Cells(i, 4)
End If
Next
For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row
If i Mod 1000 = 0 Then Cells(i, 4).Select
trimmed = Trim(Cells(i, 2))
Cells(i, 5) = dict(trimmed)
Next
End Sub
Я использовал VBA только потому, что скачал ваш .csv и открыл его в Excel. Вы можете сделать это в js с nodejs (или на любом другом языке) и т.д. c. легко тоже.
наконец, вам также нужно отсортировать данные в том же порядке для каждой категории.
которые вы можете затем загрузить в свой vizhub.
Мы получаем следующее (упрощенное, подмножество) (items1 (5) .csv):
/*
departments,category,items,total_items
Consumer,Binders,640.516,3033.072
Consumer,Furnishings,360.5,3033.072
Consumer,Phones,2032.056,3033.072
Corporate,Binders,35.448,2561.37
Corporate,Furnishings,9.708,2561.37
Corporate,Phones,2516.214,2561.37
Home Office,Binders,8.226,475.924
Home Office,Furnishings,96.53,475.924
Home Office,Phones,371.168,475.924
*/
, которое отображается как: https://vizhub.com/Alex-ley/1ebd1b410b994ce1ad4e754bd7ebf89a?edit=files&file=index.html
Возможно, вам не нужна каждая подробная подкатегория, а показаны совокупности всех аксессуаров; 3 / упаковка, аксессуары 5 / упаковка et c. в одну подкатегорию аксессуаров?
Для этого я использовал сводную таблицу Excel, снова вы можете использовать js или r или python или что-то еще.
тогда ваш .csv мог быть похожим (items1 (6) .csv):
/*
departments,category,items,total_items
Consumer,Accessories,88813.742,1117761.366
Consumer,Appliances,49371.68,1117761.366
Consumer,Art,26425.896,1117761.366
Consumer,Binders,125785.49,1117761.366
Consumer,Bookcases,42017.5103,1117761.366
Consumer,Chairs,146295.292,1117761.366
Consumer,Copiers,69819.07,1117761.366
Consumer,Envelopes,9675.696,1117761.366
Consumer,Fasteners,4159.24,1117761.366
Consumer,Furnishings,55416.916,1117761.366
Consumer,Labels,5799.714,1117761.366
Consumer,Machines,77412.897,1117761.366
Consumer,Paper,42437.478,1117761.366
Consumer,Phones,170817.884,1117761.366
Consumer,Storage,90960.646,1117761.366
Consumer,Supplies,25741.496,1117761.366
Consumer,Tables,86810.7185,1117761.366
Corporate,Accessories,48872.848,652615.8014
Corporate,Appliances,36037.581,652615.8014
Corporate,Art,16812.594,652615.8014
Corporate,Binders,55421.79,652615.8014
Corporate,Bookcases,15951.5769,652615.8014
Corporate,Chairs,82301.001,652615.8014
Corporate,Copiers,46829.386,652615.8014
Corporate,Envelopes,7132.598,652615.8014
Corporate,Fasteners,1271.652,652615.8014
Corporate,Furnishings,30250.69,652615.8014
Corporate,Labels,3192.782,652615.8014
Corporate,Machines,45886.89,652615.8014
Corporate,Paper,26087.04,652615.8014
Corporate,Phones,91110.204,652615.8014
Corporate,Storage,65843.846,652615.8014
Corporate,Supplies,19435.284,652615.8014
Corporate,Tables,60178.0385,652615.8014
Home Office,Accessories,32447.796,407236.3853
Home Office,Appliances,16014.31,407236.3853
Home Office,Art,7259.502,407236.3853
Home Office,Binders,35040.228,407236.3853
Home Office,Bookcases,6441.1488,407236.3853
Home Office,Chairs,48921.048,407236.3853
Home Office,Copiers,32879.574,407236.3853
Home Office,Envelopes,2947.198,407236.3853
Home Office,Fasteners,1598.254,407236.3853
Home Office,Furnishings,20672.126,407236.3853
Home Office,Labels,2084.156,407236.3853
Home Office,Machines,48500.096,407236.3853
Home Office,Paper,19056.248,407236.3853
Home Office,Phones,67789.114,407236.3853
Home Office,Storage,36324.928,407236.3853
Home Office,Supplies,1496.758,407236.3853
Home Office,Tables,27763.9005,407236.3853
*/
и диаграмму, как:
см. мой последний форк: https://vizhub.com/Alex-ley/5d1b6f11c9a74723b3cc29ce33e3099a?edit=files&file=data%28sorted%20%26%20grouped%29.csv - вам нужно отсортировать и сгруппировать данные и добавить столбец итогов. Вы не можете иметь несколько линий с одним и тем же сегментом и подсегментом, например 22,Consumer,Accessories,90.57``` and
34, Consumer, Accessories, 45`` - вам нужно объединить все потребительские аксессуары в одну линию.
Кроме того, хотите ли вы, чтобы диаграмма имела такую ориентацию:
Или как это (код / данные явно нуждаются в изменении для этой ориентации ):
Конечно, вам нужно преобразовать данные для этого, и тогда это будет выглядеть так:
Данные теперь: https://vizhub.com/Alex-ley/5d1b6f11c9a74723b3cc29ce33e3099a?edit=files&file=data%28sorted%20%26%20grouping%20reversed%29.csv
/*
Row ID,Segment,SubCategory,Sales,Sales_total
1,Accessories,Consumer,84754.742,163246.386
18,Accessories,Corporate,47150.848,163246.386
35,Accessories,Home Office,31340.796,163246.386
2,Appliances,Consumer,42852.68,89615.571
19,Appliances,Corporate,32593.581,89615.571
36,Appliances,Home Office,14169.31,89615.571
3,Art,Consumer,15847.896,30817.992
20,Art,Corporate,10170.594,30817.992
37,Art,Home Office,4799.502,30817.992
4,Binders,Consumer,116251.55,198841.568
21,Binders,Corporate,50009.79,198841.568
38,Binders,Home Office,32580.228,198841.568
5,Bookcases,Consumer,33161.5103,49404.236
22,Bookcases,Corporate,12138.5769,49404.236
39,Bookcases,Home Office,4104.1488,49404.236
6,Chairs,Consumer,131658.292,249227.341
23,Chairs,Corporate,73814.001,249227.341
40,Chairs,Home Office,43755.048,249227.341
7,Copiers,Consumer,69819.07,149528.03
24,Copiers,Corporate,46829.386,149528.03
41,Copiers,Home Office,32879.574,149528.03
8,Envelopes,Consumer,5493.696,12006.492
25,Envelopes,Corporate,4303.598,12006.492
42,Envelopes,Home Office,2209.198,12006.492
9,Fasteners,Consumer,1084.24,2109.146
26,Fasteners,Corporate,656.652,2109.146
43,Fasteners,Home Office,368.254,2109.146
10,Furnishings,Consumer,37827.916,73375.732
27,Furnishings,Corporate,20533.69,73375.732
44,Furnishings,Home Office,15014.126,73375.732
11,Labels,Consumer,4200.714,7755.652
28,Labels,Corporate,2085.782,7755.652
45,Labels,Home Office,1469.156,7755.652
12,Machines,Consumer,76920.897,170446.883
29,Machines,Corporate,45394.89,170446.883
46,Machines,Home Office,48131.096,170446.883
13,Paper,Consumer,33089.478,72406.238
30,Paper,Corporate,22643.04,72406.238
47,Paper,Home Office,16673.72,72406.238
14,Phones,Consumer,168357.884,324428.202
31,Phones,Corporate,89019.204,324428.202
48,Phones,Home Office,67051.114,324428.202
15,Storage,Consumer,77676.646,163363.42
32,Storage,Corporate,54158.846,163363.42
49,Storage,Home Office,31527.928,163363.42
16,Supplies,Consumer,25741.496,46673.538
33,Supplies,Corporate,19435.284,46673.538
50,Supplies,Home Office,1496.758,46673.538
17,Tables,Consumer,83120.7185,166142.6575
34,Tables,Corporate,57226.0385,166142.6575
51,Tables,Home Office,25795.9005,166142.6575
*/
Я также исправил проблему при наведении, которая возникала, когда бары отображались при категория была отображена в легенде и отображалась неправильно (они отображались слишком широко, часто ниже оси X).
https://vizhub.com/Alex-ley/5d1b6f11c9a74723b3cc29ce33e3099a?file=index.html
Требовалось следующее:
из строки 204:
if (hoveredColorValue) {
setOverlayTransparency(0.7);
const filteredLayers = layers.filter(function(layer) {
return layer.key === hoveredColorValue;
});
console.log('fl', filteredLayers);
renderBars(
foregroundBarLayer,
filteredLayers,
layers //important!
);
} else {
setOverlayTransparency(0.0);
renderBars(foregroundBarLayer, []);
}
и из строки 229:
function renderBars(g, layers, masterLayers) {
var layerGs = g.selectAll('.layer').data(layers);
layerGs
.enter()
.append('g')
.attr('class', 'layer');
layerGs.exit().remove();
const maxLayers = masterLayers || layers; //important!
const maxY = d3.max(maxLayers, function(layer) {
return d3.max(layer.values, function(d) {
return d.y + d.y0;
});
})