Skip to content

Instantly share code, notes, and snippets.

@AlainRo
Last active March 4, 2018 17:22
Show Gist options
  • Save AlainRo/c6a63abc63c7bfe254a42f7fed2d365c to your computer and use it in GitHub Desktop.
Save AlainRo/c6a63abc63c7bfe254a42f7fed2d365c to your computer and use it in GitHub Desktop.
Draggable barChart with dispatch
license: mit

Barchart as an input device

Brushes can be used to draw a barchart. This gives an easy way to input or adjust values with the mouse !!!

The d3 brush is a complex piece of logic taking care of events and user feed-backs. Among other characterics it exposes a nice selection rectangle which can be used as a bar !!!

2D-brushes come in two flavors see official API v4 doc

  • d3.brushX()
  • d3.brushY()

Let's try both of them on this example.

Code comments

Code is made of:

  • CSS
  • a data definition in the form of: [{index:2, value: 23.34}, ...]
  • two almost identical barchart generators (horizontal/vertical) allowing to drag a bar to a new value
  • a refresh function which propagates data updates into the two barcharts

Enjoy !!

forked from AlainRo's block: BarChart with draggable bars to input/adjust data values (Horizontal + Vertical)

<!DOCTYPE html>
<meta charset="utf-8">
<style>
.selection {
fill: steelblue;
fill-opacity: 1;
}
body {
width: 80%;
margin:auto;
}
</style>
<body>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
var data = [{index: 0, value: 3},
{index: 1, value: 5},
{index: 2, value: 12},
{index: 3, value: 8},
{index: 4, value: 20},
{index: 5, value: 7},
{index: 6, value: 2},
{index: 7, value: 15}
];
var dispatch = d3.dispatch('refresh');
//--------------- HORIZONTAL --------------------
var widthX = 300,
heightX = 250,
delim = 4;
var scaleX = d3.scaleLinear()
.domain([0, 21])
.rangeRound([0, widthX]);
var y = d3.scaleLinear()
.domain([0, data.length])
.rangeRound([0, heightX]);
var svgX = d3.select('body')
.append("svg")
.attr("width", widthX)
.attr("height", heightX)
.append('g');
svgX
.append('rect')
.attr('x', 0)
.attr('y', 0)
.style('stroke', 'black')
.style('fill', 'lightyellow')
.attr('width', widthX)
.attr('height', heightX);
// Moveable barChart
var brushX = d3.brushX()
.extent(function (d, i) {
return [[0,y(i)+delim/2 ],
[widthX, y(i)+ heightX/data.length -delim/2]];})
.on("brush", brushmoveX)
.on("end", brushendX);
var svgbrushX = svgX
.selectAll('.brush')
.data(data)
.enter()
.append('g')
.attr('class', 'brush')
.append('g')
.call(brushX)
.call(brushX.move, function (d){return [0, d.value].map(scaleX);});
svgbrushX
.append('text')
.attr('x', function (d){return scaleX(d.value)-10;})
.attr('y', function (d, i){return y(i) + y(0.5);})
.attr('dy', '.35em')
.attr('dx', -15)
.style('fill', 'white')
.text(function (d) {return d3.format('.2')(d.value);})
function brushendX(){
if (!d3.event.sourceEvent) return;
if (d3.event.sourceEvent.type === "brush") return;
if (!d3.event.selection) { // just in case of click with no move
svgbrushX
.call(brushX.move, function (d){
return [0, d.value].map(scaleX);});}
}
function brushmoveX() {
if (!d3.event.sourceEvent) return;
if (d3.event.sourceEvent.type === "brush") return;
if (!d3.event.selection) return;
var d0 = d3.event.selection.map(scaleX.invert);
var d = d3.select(this).select('.selection');
d.datum().value= d0[1]; // Change the value of the original data
dispatch.call('refresh');
}
//--------------- VERTICAL --------------------
var widthY = 250,
heightY = 300;
var scaleY = d3.scaleLinear()
.domain([0, 21])
.rangeRound([heightY, 0]);
var x = d3.scaleLinear()
.domain([0, data.length])
.rangeRound([0, widthY]);
var svgY = d3.select('body')
.append("svg")
.attr("width", widthY)
.attr("height", heightY)
.append('g');
svgY
.append('rect')
.attr('x', 0)
.attr('y', 0)
.style('stroke', 'black')
.style('fill', 'lightyellow')
.attr('width', widthY)
.attr('height', heightY);
// Moveable barChart
var brushY = d3.brushY()
.extent(function (d, i) {
return [[x(i)+ delim/2, 0],
[x(i) + x(1) - delim/2, heightY]];})
.on("brush", brushmoveY)
.on("end", brushendY);
var svgbrushY = svgY
.selectAll('.brush')
.data(data)
.enter()
.append('g')
.attr('class', 'brush')
.append('g')
.call(brushY)
.call(brushY.move, function (d){return [d.value, 0].map(scaleY);});
svgbrushY
.append('text')
.attr('y', function (d){return scaleY(d.value) + 25;})
.attr('x', function (d, i){return x(i) + x(0.5);})
.attr('dx', '-.60em')
.attr('dy', -5)
.style('fill', 'white')
.text(function (d) {return d3.format('.2')(d.value);});
function brushendY(){
if (!d3.event.sourceEvent) return;
if (d3.event.sourceEvent.type === "brush") return;
if (!d3.event.selection) { // just in case of click with no move
svgbrushY
.call(brushY.move, function (d){
return [d.value, 0].map(scaleY);})
};
}
function brushmoveY() {
if (!d3.event.sourceEvent) return;
if (d3.event.sourceEvent.type === "brush") return;
if (!d3.event.selection) return;
var d0 = d3.event.selection.map(scaleY.invert);
var d = d3.select(this).select('.selection');
d.datum().value= d0[0]; // Change the value of the original data
dispatch.call('refresh');
}
//---------UPDATE VERTICAL and HORIZONTAL
dispatch.on("refresh", function (){
svgbrushX
.call(brushX.move, function (d){
return [0, d.value].map(scaleX);})
.selectAll('text')
.attr('x', function (d){return scaleX(d.value)-10;})
.text(function (d) {return d3.format('.2')(d.value);});
svgbrushY
.call(brushY.move, function (d){
return [d.value, 0].map(scaleY);})
.selectAll('text')
.attr('y', function (d){return scaleY(d.value) + 25;})
.text(function (d) {return d3.format('.2')(d.value);});
});
</script>
�PNG

IHDR*,큘3sRGB���,�IDATx�� lT���_������%�Sc4����&��)Y��!\q�*Is{���ʭ.޽+@{���(A�W�jeU�n��7!Q/�&��i �:�X�� �1.6�8,��qi�6�ό����Μ�33�#M��<�y�<���9�9�/�"@ ���*b��4�#PYY�;,i>s  m����n�#��EUU?��𯱂 ��L�@�fBs@@`L�@ê5@������� � ����ʘk � `3� �A@�1�1 �@@�f*6�� �c*c�!� ���Tl6 4@�T�,XC@� �� �A�J o���YT.��E�@e.Z�E������#R��=#R��,�����ȁ �Q P�<�"� ���*3�@�$@�%x�E@��Tf6" �DI�@%J�T� �3 ��lD@���Q�<�"�X'�.���/9���6�uN���(WKH�/�)���G�-�h�S/ �@�n�S�c��v�^0(�w�Тm���+G�~t�
:�?(�$�l���Q���PbXFG2,�Q ��x�o
�NR�Gj���kʒ��ڷ6ݷ��� E��=�M�V�)��^=U�VS�t*��@ v\+T��O�>���i������|�_t�R�J��2�z��� ��z��S�rh������k)�J� 8�E�V�ϟ��F=���O���*�u*�luvt�����:�% ���l,�5 ��h0h
 �@�v�`C׸����������*\�������qy��[����`\26 P��@� @�0 ��Ѧ;��{���m�R�����}XbF�@%f���"��^ G5��*������ﰶ�χ�\��su�`��~*�Z� ����{�V���Gf͚�:�{|�޲薀�o��Nf�Gm���G�"�>M�% ��_`�wש$��j�9�ڑb�~�A���;|����+ܕ�E����zT7�ʚ�Tl44@ 4����񥩒��gˏ��;޿r�de�g�:p\���dq���N���U|3�� �Q݉��*�h�T,��`@��
�ɳ�
��U&�*�<�mt�rI�����2��S�Ck���'�zt�t�o��h^��%@�b��5 ��h=�M{�'�N]D�vּ)wA�rM���j�:3{l @�b�A�  ��h!@�,x�q�Ox� ��
�X�K� � ��Jx� ��
�X�K� � ��Jx� ��
�X�K� � ��Jx� ��
�X�K� � ��Jx� ��
�X�K� � ��Jx� ��
�X�K� � ��Jx� ��
�X�K� � �@��UU��|#� ���*��նh���6�l�B�����Y���!����@e���S�ў#{6ڨ54@�`������ �! ����� � `������� �! ����� � `������� �! ����� � `������� �! ��d�l�[��T #� ���?�m���ר�(ݟ�u�[�^���V+ � ����Ϩ��)-ͭ��m���))Mݿ���P8 � (�J��d5�n������wݬ7��Qrj�&�@�@@�p  T�jO�.��������cgRYE@���VY�v��gk���L��O�i�{�F@���ZN�
]N�_��~o;�*۴F%ַ�@@��4gT���/O 3�
�£y�Nr�R]3z � ���ӜQ ���Y���;X@@�
�.P1 J�弡&ΦDpx�
@��z駰t���t��墪_iV�U*]�P��V�&��G@�
 T48dΠ8�+O5{��5�k�����sU"�>�B@��4���64g�$+U�ѫ�֞&�� � -�����1�]��V��@0OG@����]G�v!� �gT� � ��}8�b߱�e �$��J��@@����~���h�V�2@HH�RUU��� �@�@@��\����*@0�3*��ՀL)�6�v � ��u�@e������%3w'���#�ļ�~b~� ��+�?��]�g � 0���:�#�O� P�"!� �8��l��~�wFO@�9��2� �@��$�X�S@bN�@%憌#� �8�TJ��̕8�AO@@`��������GT�;yT����-f @F�>�J�
�6AJ��^��+��vIխ 3t@&�&Pٵ&[)&D�o����65Mh(� �  �*��QS� m�-W����.N�������)U%�>ݗ;��/�m<;@@�.����m�;Cך���W' ����s�I�����m�@%pB�ؑ�^k����mS]k����+ϸ=G/?�,�-�>@��@�����&w�/��L.�w夿O�Wo���\���k��qB�=Ψ�K���7m�%��JSƒl��j�{XA@� tig�Q�Kר�8}r�F��^�ҡS��m��?9��{�Q�&��N��L8���‚ ;�D@[
�.VT���C��w�b�*ٽN���4Az�� #�4|�hH�݈t�ԇ ���k�X����٫}��&�9�Wj�,*�ɥ� -u�j�W�ܞ�$@bG��t��ݼ�|��K����o����&L���-[�Q)��z��<j�S2��T�"�lÇc��p6@@ Z���#���;���5clqFe�7;ء%w�L��2gRt�D����d�{J@����mA3�����_�ۮ�y���7���3��  � Y����s�&׶|ry�|澚sD(CKk�Z"T� � �@��G��e�9�0��
t�<���U���r���l��.���ʉm����� ��&�����R�Yɾ�g���Py��֜T��ݻ)iN�mި2���J�v>�ެ����o��"� `;�.�����[�٬-{�UR��R������
(�@%�U@�B�Gu�=�*��'ϫ�� �q/@��CL@�]���#{6�n/h9 �ĥ�?P���Pe厸�$�B@����Ol��F@ !Tb��$ ��)��SYY�=�� (Ж�}�� �@b
�� {'���)&}��p�X@ d.��LH � `���U��� �! ��LH � `���U��� �! ��LH � `���U��� �! ��LH � `���U�qT�ە9Eo�UZ�����)��� �@h���V Gǣ��(_?����P���U�ɲo�Ѷ{ҕ2�V���t�7��|k@&V@Q�3*!���kWi��&HYd~"�/��E�*7AJ��.�}ԥ�A�3ũ�7��;0� ��(�����c'��X�jv��|�?K��i˯[���]�C���LI��I�W�� A�b�^UΠM����U��t^V�`�/Hw�%��$"� 0{��[�sD�.0H�e/V��%�_�QJ ���Xo,�`=�*������7-�S�=����S�Q Ro���v��j�ik������5*�v��퓪n{�� ��* ���E+��8]�g�hg}OHEq0 ��T���6�@v�^ޘ�k�Ѷ�.�7i�W�d�Ɂ �����2+�D�4rOR������ߺ�aҺ��r�2��/;S��� ���@E�@%�8>ֽ�X�Ȓ�� I����U��v�ե�m˵ěn��(-@���Sg�YE@ 4�������m�޽�o�:�.R@�sT��Ia � N�pjR `K�t��h�o�� We�-�%S��gd�( p�'J�T�X/����.Ц�3t����|u�=oŷ���r;G��Z����E�^9g}���9��B�pY@�/��}�q��J1��7������@�!5}ԡ�+�w�-�˭}k����@�T�>4�B�K;k���1��]+T��O�>���i������|�Xt�V4�2���ʼ�8��@� ����z��Q�4����l���}�sTx�}�� ��
|ڡ����ᾜ/��Ο��2> [DE��TUU��rGTA� �QpݣMw$���E=��E�8TL���I �@� ���\��^Ѧ_����ҿ�*��<k4�/H�ۂ����U~���UuuC� ��D /�������a��#P]��gnQ�C ��&uf�wש$��j�9�ڑ�[���
��c��혔���
D���������S; ���#�޲0��R�����TiP��u�����#Y��*�~K�b�XP���ܷ6��8
@�N�z��뵷��kT�k���z����m��JJU��Te8�'͡�+���i�~ЖD��J���?ĩ@�~����}k=�M{�8�T� pF�n#B{@@�/@��`@�&@�b��= � � P�S�� �v P������8OeE9�aI, ��I ]��S���ʜz���p��<�l�_i[Q�R=�Or(ec�N�۬=o��ypr �@�ҵ���tw��5�ѓ��ɤ�(_?����P��c� [�D�2WTW�/H�ԪM�<k�6��عB�ߩB�4͵<�#� �L�+_����J1��{�Z�v��|#C�s1�<�o�n�nq�g�C�^���h`�����_�áiβ�f�@�����*{���t줶�W� Rbi��G����1�R�^xԣ��Pi�y�cg��]s,�� ��M w�t� F�H�ڬ/h��X_{,��٬�{}-Ͼ˭��L�^nӦ<�1��6#��[�@e�����p�������5��8@� P��'��<�]�lO�nS��Z_R��}Pe���� �� P�#�{��Zbf�����?ݬ'�iVK�)�+�Es,�� � 0��ʴ<�w�f�'�gM��oΊC�-���L�) �q%08�!P��0�]�����iK�����_�5��Ȏ ��C�޴���#%߲���i�2�����y����1�i�t��1���L��٨7�q�J�����i�LDz@�G���I�;�K����z�-�9õL��W�p���b�}�ܾ��j���ڷ��Wx��<~%��vB������[��!��6}�G9� �x����i�(��+�Х?wt��Z���~�ݶ�A�2��Q���O��w�� ����������*�Iǥ��Wz� `S�����k��M�i�f��f(h �@� t�i|�sf~<��-��&� � `�����+w�w18id\�� P�ޘ@� x��'1q{�N6|*�@����[�iG���=��������#� , � `��g[��'��
�n{�o�w�KgcL��TUU��r���@@ lCG�-hY��$��6�D.�LI�@�'0����%N�>1_�n�ϨTVV'��F�� �E�f*F ����s�!h��t�_7���6h��M�*�N\z�`^\�ɩ0����7 �xӽ�� ��$.��@@�b�����OU�L��:.� Ta��# �@T<�������i�����M��H�M_@".��'����e�z����X& ��L�E
 ��*�E�99���/�s��z`�7�M_�ݿ��a~  �X(�(]�T�]��z��R�}տ�Jp.�w!@l @�b�A�  � \�K?�]HE ��UZ�����~�cr߲3U�딆zU{�k�~R� ���"��C#�l�ZT�;6� ���}k��ݓ��������渞oN()]��+�TʠGJr���n=[����R;�ģ@��C���3�>q�g�f�@���)�W�T�Q��M�S�z|�*���(Z� Rt�S�yS^�P�3CW�2v�HK@ �T�zx�\� �?K��i�s'��oN�_��׋��� Tvݿ�w����{�T͍���Qʢ�z�8���?�A�@��@�H���>��_<h��:�gU�ҧݙn�๡ޕ���f�Cw.��\_��@`���86�/���5v){���̴��=�se����30�H �(kQ`*� �@TT��N�DG�|�R95��O4Ji ��jE� @�2,�"���kT��P��'U�lz�|C�̍>�?�|6q� �@�T"NN�DA�h���������i�g��*I�
����p�? ���E��T���9*�=�B ������]�茶�vq�&���[�m��Qv��W����]Λ͊G�/��N����ە���wu��u4@�s1��* ����.���R��f�b�^�X��𗝩�Ԫm������g��RR-�zh���r�CϞ�w�g�@�~V�\�N�[�7���8T~�����a��n�@�q$���8L���D��m˵���s�$cQ�2L�������Sg�<�F�y��<�-S5����<�#�v���f�- �(7��|�8�M��Գ =J�Z�rsf���
pFe�b�G ���������Imz+]%�]?7zU�)���=�@��x�ϣ!���^��^�d���4�ގ��T����@� ��43� �ݒw���T���-��޸�;���k��yO���y�*q>�t����_���X&��Nm�\`�7o�~�jZ#ݒp�xo\$��ѣ�*�|#��I�EG.��}w�Hyɺou� T̼�^���� 0V&o�2�L��� �@���T� Rڛ[t����(s�R�l��D� �p[ ��zxh kfb�R31�ӫ�^=��/֩������E���k M@�G�V-�=3��������j7/�Lq:U8��7���Q��,�Ȇ 0��E��^�%YN���Tݱ.��6ߛ�{/]�o�ȱ+��?P���Pe��HE@`����C�'��Y�#��3+I� �׻��/�Ͳ�!0&�TƒXC@ �6�W���ʑ{��]�SB?Hpe�{��񗃂����K>���+�۬ ���ʙ�_ Yd��>��Ԇ�hi�PK� ��������烶<0ݛ�e��?P v/���DB��B�P�@ 2Wӳt�+������������2Y��L�E
 ��V�b�#*�r3�`��[8m����~�����N��t@*�G� ��z�Z:{�r��~؝7���w�Z,�f.6 � �@�]Nu^hն_�&�`���l����v5�h )YɃ�*�����I Pᗀ �@�u��nB����ykt������x���'�?������~�! � v�ߖ,]��������2Uz؛������l@ ߡ%�E��v#�
H�J���+*��z�����O�1}��e���|@�9l�O&���e��e����M����L߭���'��q���N��z�*2�W�6�nC;���?ep���9����r<�F ֯�cM���:��p$ �@#�}�w�� �4���5�Ο��f�^ q����D���4yi?Өm�uL�1!���oP���5��=��6=�����_馛S�x�>-x��}��M�n��`@� #�}�['��>m��*�m��6P)�f� R<j�ҫ����;���>=:1x����Ϻ��}�6��'Y=c���g���/>�������n�j�?hY�������6��@��_�yo�ߒ3�{�IL��� �@�*9�Z� :p\�;�~ ��Qvz�jO�9���k�>��1y��^�8�5�;��'�y��Dz��'c��X��N ���J��Ȓ��G�l�9�Rl�O�`�Ҩ � �@h����n��+������{�GW}����d�'���J�v�L�t��U�ȡ^s���Ь>������G�uD2q����ϒ�8\�J���Ђ-��Q��
 -�ռ&e\��7&�9/?����~��,����d�����4������>����ݫB:�2���pF�>cAK@ ����R�=�ގ� T�-yv�N�2���̋�F/�x�=79t��|o�띣r��׊3G�3�Q�����������\�oOn H�z���;�~�Ρ�9*��esGsT��b `���w|M�fd���2�����\��w���x���Tl�k��3-ޏwYr��
M�Rd&�zoM���ʲ2�w׏�E�;e���]?VjS6 07�?�_(�/� �����M�b�}���T���9�
ڳr�����L)���z��ە��.Gr�?G�;Av�}��E�@���,��=[g�V�����sb�n�� QR��k����}2mޕ�]��O}��$W�w�T��\޹}4�o@�F�@e��ϥ���|�(_Mϒ�c��(]ku�� �@����}>�g�6T� ����J�{�R[���  0;���e [.�/#����@�>PQg����na��P
l�{8pӲ���XV<#`{����c��� �$��J>]G@��*v!ڇ �@ �$���u@�.@�b��} �$����f�'𯀮#� `S�RUU���6m&�B@�D��O"�:}F��ܖ��ks�S7�"��3*1�~���W�`��؜����w�i��Ⱦ]=�zV�9�RYYs����(���cq�h��v��VJ��{���=���w��c~����@%R��NTh�-1a�_AB ��)���ԥC��U�ܕPݧ��K�9*ᒤ@ @�b�9�b��w�b�*ٽN���r��� P��y@�9
�5|��Ow��վ�#�RU�q��α�#���K?�A�@�p
4�nQ�h��|��K�IiZ��\=��iGi�F`&Ψ�$�~@ T�ֳz�H��M9�9Y����$��JB 7�E�� �{���Z��X P��Q�� �����O.�`�i2�`�J���U�U�CO�)�F�j�WM�[6fK�w�@-�)���/k8�b��mJu�2�iK�
�;Y@ �7��KIs�l�F��2-�ީ�?=96�6�UR�*��8YwQ�~x�R�/��ꧏ�v\?ӵ���tw��5�ѓ�r�86U��Y[�����)�,Pw�E5u�Z(�#��*q8�kWi�72��>�{Py��HO3��|���'������C��@�zT���6P=�/�����I=h:vR[�ի�)��.��9��F�:ن@� ��mD��s�y�%wC? �@l"�_+� �@@��*�MHA@���d h �Lட�&� �@L�E��m���@�+@��迃��D��1,�a�ሴ�Ȟ���J@`��~&��I���S�����#��eaZ���n �ģ�J��{u���On���Tmݽ^�֍>J?SO}��߾��Z�C�T�t @ ����c8�-� �R?)y$�K?~��T;IG@�V�Q��p�@ P �`@l%@�b��1 � (@���: ��J�ɴ��V�)�K��ܢ�V+j�L�J�@�*Y�E��g_���ѓ���xk��|� �F@`6�@�'/Ά�< K���Q��G�jۥ�ޡM�v�j����X�mE ���JUU�*+w$0]G���UF���9�:o����ŏ�t�C)��5w�Wo� �*�Tⵃ� U�v�8���|�� Rz/\�~��1����?P����ySi�(�w�>j��j�z�V/u*�4�[ ��$���*�z ��FNb[�y_��Bw�ro���GK̤ڌ�y:���GiL+�T���N@ F��U>����-і�i�^r�� �J�)�N0��{���tQ`�o�ԟ���İ�J MG�� \�:�9
".�����S!DF �<��^���U���Usک}��*e�G_ �(2������<�8 �.�'9�3S��U�q��H�W������ؽ��|*�@ N��㧇�ve*7-U�;��=�[ij�J<�.}C��v��;@ ��LÃG�' x��<��tm��\��I@�h
pF%���6wQ�~x�R�/��ꧏ�vBɻ~��J��r�j_<;!� �v P�ۈО9 �]�=�Ȑ3�"���B9~)X��&H��k��<��vIխ㳱� `?�� -��@ӱ��r,]5�����]k��;^�T�tA��mj
��$@{
��s\h՜���p��;�"���ߧ�r��Ec���"��J 𢽭Fc�@�%��n��Z��=����s����R<� �X+�k})=�]:�V��۟0/�s�)cI�JunҤ[FV@l!�[ ������T�#%��� R�R ��|T�+�q1+�o�iH�݈�.�p@ aTf��_���E�Q=�'�IXA�*��� 횣���S���pd��֫��j��m{����JIg���۔�XE�*@�bב�]�p�.־�����S�u�z6���f��2�CK�r���9�2�S'�����YWDF@�� �D��
�-�Rߠ-��K��ˣzەcޞ�}�J�j� P�K���S�@Ş�B��(�����s��IQ �@$�LIm�B@�9 �̉�� � I�HjS ��I�@eN\dF@�H
�DR��@@`N��~���8�Ɍ �X-p�f�VRUUau]���M���:leͦ���FF�no[�Y?u���z���[����o���wF4��΢IEND�B`�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment