venn.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334
  1. import { intersectionAreaPath, scaleSolution, venn } from './utils/venn';
  2. /**
  3. * Layout venn data, get the path string for each set.
  4. */
  5. export const Venn = (options) => {
  6. const { sets = 'sets', size = 'size', as = ['key', 'path'], padding = 0, } = options;
  7. const [key, path] = as;
  8. return (data) => {
  9. // Transform the data, venn layout use `sets` and `size` field.
  10. const vennData = data.map((d) => (Object.assign(Object.assign({}, d), { sets: d[sets], size: d[size], [key]: d.sets.join('&') })));
  11. // Sort data, avoid data occlusion.
  12. vennData.sort((a, b) => a.sets.length - b.sets.length);
  13. // Layout venn data.
  14. const solution = venn(vennData);
  15. let circles;
  16. return vennData.map((datum) => {
  17. const setsValue = datum[sets];
  18. const pathFunc = ({ width, height }) => {
  19. circles = circles
  20. ? circles
  21. : scaleSolution(solution, width, height, padding);
  22. const setCircles = setsValue.map((set) => circles[set]);
  23. let p = intersectionAreaPath(setCircles);
  24. // Close the path for event picker.
  25. if (!/[zZ]$/.test(p))
  26. p += ' Z';
  27. return p;
  28. };
  29. return Object.assign(Object.assign({}, datum), { [path]: pathFunc });
  30. });
  31. };
  32. };
  33. Venn.props = {};
  34. //# sourceMappingURL=venn.js.map