Привет, я присоединился к команде Разработчики социальных таблиц три месяца назад. До сих пор это был отличный опыт. Любите культуру, любите свою команду, любите продукт, который я создаю. ٩ (˃̶͈̀௰˂̶͈́) و

Прямо сейчас я работаю над Guest, приложением для управления списком гостей. Наш основной интерфейсный стек - это React и Redux. Одна из целей нашей команды в этом месяце - реализовать новую функцию статистики отметок. Это совершенно новый вид для визуализации данных о заселении наших гостей, включая радиальные гистограммы и линейные диаграммы. Первое, что нам нужно решить, - это решить, какую библиотеку мы должны использовать для построения диаграмм. d3 - наш первый выбор, но построение графиков напрямую с d3 может быть затруднительным, в то время как другие библиотеки часто слишком упрощены.

Основываясь на нашем исследовании библиотеки диаграмм, созданной с помощью React и d3, мы нашли двух идеальных кандидатов: Victory и Rechart. Оба они используют декларативный подход React / JSX. Это естественный вариант для нашего стека, поскольку нам нужно только снабдить компоненты диаграммы некоторыми реквизитами. Мы сравнили их по шести различным критериям: покрытие потребностей, настраиваемость, анимация, отзывчивость, мобильная поддержка и хорошо документированные. Наконец, мы решили использовать Победу. Есть две основные причины. Во-первых, Victory поддерживает React Native, что упрощает повторное использование кода в нашем мобильном приложении. Другая причина в том, что он более настраиваемый. Иногда использование библиотеки компонентов диаграммы может вызывать разочарование. Как и любой фреймворк, который дает вам высокоуровневые абстракции, наступит момент, когда ваши потребности станут очень конкретными и не будут соответствовать. Victory предоставляет такие компоненты, как VictoryAxis, VictoryBar, VictoryLine… Он покрывает все наши потребности.

Код, который может оказаться полезным (очень приветствуется проверка кода, пожалуйста, оставьте комментарий, если у вас есть какие-либо предложения):

//radial bar chart
const colors = {
   pink: ["#CB5599", "#5E6063"],
   teal: ["#49C6B7", "#5E6063"]
};
<VictoryPie
  data={data}
  x="guest"
  y={(datum) => datum.value}
  style={{
   labels: {fontSize: 0}
  }}
  colorScale={colors[color]}
  innerRadius={115}
/>
//line chart
<VictoryChart>
   {
      data.length > 1 ? <VictoryLine
         data={data}
         x="time"
         style={{
            data: {stroke: colors[color], strokeWidth:4},
         }}
         y={(datum) => datum.value}
      /> : null
   }
   <VictoryAxis
      // x
      tickValues={xRange.length > 1 ? xRange : ["8:00 PM"]}
      tickFormat={(tick) => {
         if (data.length < 1){
            return tick;
         }
         const time = data[tick-1].time.split(":");
         return formatTime(time);
      }}
      style={{
         axis: {stroke: colors.mediumGray},
         ticks: {stroke: colors.mediumGray},
         tickLabels: {fontSize: 12, padding: 30, stroke:"#EAEDEF"}
      }}
   />
   <VictoryAxis
      // y
      dependentAxis
      tickValues={yRange.length > 1 ? yRange : [0, 3, 6]}
      style={{
         axis: {stroke: "none"},
         grid: {stroke:colors.mediumGray},
         tickLabels: {fontSize: 12, padding: 30,   stroke:colors.lightGray}
      }}
   />
   <VictoryScatter
      data={data}
      x="time"
      style={{
         data: {stroke: colors.lightGray, strokeWidth:3, fill:colors.lightGray},
         labels: {fontSize: 30},
      }}
      y={(datum) => datum.value}
   />
   <VictoryVoronoiTooltip
      data={data}
      labels={(datum) => datum.value}
      y={(datum) => datum.value}
      x="time"
      style={{
         labels: {
            fill: "white"
         },
         flyout: {
            fill: colors.mediumGray,
            strokeWidth: 0
         }
      }}
   />
</VictoryChart>

В целом, с Victory это был отличный путь. Просмотр статистики регистрации был завершен в короткие сроки, и результат потрясающий. Хотя мне потребовалось некоторое время, чтобы найти информацию в документации библиотеки, вы всегда можете задать вопросы через Gitter.