Skip to content
Snippets Groups Projects
Histograms.vue 4.07 KiB
<template>

  <div>
<!--    <h3 class="text-center text-2xl font-bold">Histogram of Condensates</h3>-->
<!--    <div ref="proteinHistogram" class='chart'></div>-->

    <h3 class="text-center text-2xl font-bold">Condensate Proteome Size Distribution</h3>
    <div ref="condensateHistogram" class='chart'></div>
  </div>
</template>

<script>
// require modules
/* eslint-disable no-unused-vars */

const _ = require('lodash');
const am4core = require('@amcharts/amcharts4/core');
const am4charts = require('@amcharts/amcharts4/charts');
const am4themesAnimated = require('@amcharts/amcharts4/themes/animated').default;

am4core.useTheme(am4themesAnimated);

export default {
  name: "SpeciesChart",
  props: ["protein", "condensate"],
  components: {
  },
  data() {
    return {
    }
  },
  methods: {
    drawHistogramChart(chartRef, data, breakStart, breakEnd, valueEnd, xTitle, yTitle) {
      const chart = am4core.create(chartRef, am4charts.XYChart);
      chart.hiddenState.properties.opacity = 0; // this creates initial fade-in

      chart.data = data;

      var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
      categoryAxis.renderer.grid.template.location = 0;
      categoryAxis.dataFields.category = "_id";
      categoryAxis.renderer.minGridDistance = 40;
      categoryAxis.title.text = xTitle;
      categoryAxis.title.fontWeight = "bold";

      var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
      valueAxis.min = 0;
      valueAxis.max = valueEnd;
      valueAxis.strictMinMax = true;
      valueAxis.renderer.minGridDistance = 30;
      valueAxis.title.text = yTitle;

      // axis break
      var axisBreak = valueAxis.axisBreaks.create();
      axisBreak.startValue = breakStart;
      axisBreak.endValue = breakEnd;
      //axisBreak.breakSize = 0.005;

      // fixed axis break
      var d = (axisBreak.endValue - axisBreak.startValue) / (valueAxis.max - valueAxis.min);
      axisBreak.breakSize = 0.05 * (1 - d) / d; // 0.05 means that the break will take 5% of the total value axis height

      // make break expand on hover
      var hoverState = axisBreak.states.create("hover");
      hoverState.properties.breakSize = 1;
      hoverState.properties.opacity = 0.1;
      hoverState.transitionDuration = 1500;

      axisBreak.defaultState.transitionDuration = 1000;
      /*
      // this is exactly the same, but with events
      axisBreak.events.on("over", function() {
        axisBreak.animate(
          [{ property: "breakSize", to: 1 }, { property: "opacity", to: 0.1 }],
          1500,
          am4core.ease.sinOut
        );
      });
      axisBreak.events.on("out", function() {
        axisBreak.animate(
          [{ property: "breakSize", to: 0.005 }, { property: "opacity", to: 1 }],
          1000,
          am4core.ease.quadOut
        );
      });*/

      var series = chart.series.push(new am4charts.ColumnSeries());
      series.dataFields.categoryX = "_id";
      series.dataFields.valueY = "count";
      series.columns.template.tooltipText = "{categoryX}: {valueY.value}";
      series.columns.template.tooltipY = 0;
      series.columns.template.strokeOpacity = 0;

      // as by default columns of the same series are of the same color, we add adapter which takes colors from chart.colors color set
      series.columns.template.adapter.add("fill", function(fill, target) {
        return chart.colors.getIndex(target.dataItem.index);
      });
    },
    drawProteinHistogramChart() {
      const vm = this;

      vm.drawHistogramChart(vm.$refs.proteinHistogram, vm.protein, 50, 2310, 2320, 'No. of Condensates', 'No. of Proteins')
    },
    drawCondensateHistogramChart() {
      const vm = this;

      vm.drawHistogramChart(vm.$refs.condensateHistogram, vm.condensate, 22, 210, 213, 'No. of Proteins', 'No. of Condensates')
    }
  },
  mounted() {
    am4core.options.autoDispose = true;
    // this.drawProteinHistogramChart();
    this.drawCondensateHistogramChart();
  }
}
</script>

<style scoped>
.mainContent {
  padding: 20px;
}
.chart {
  width: 100%;
  height: 500px;
}

.legend {
  width: 100%;
  border: 1px dotted #c99;
  margin: 1em 0;
}
</style>