[JAVA] [Rails] Création du deuxième axe vertical et localisation japonaise dans le dessin graphique à l'aide d'amCharts4, etc.

introduction

Dans cet article, nous utiliserons amChart, une bibliothèque de dessins de graphiques JavaScript, pour partager comment créer un deuxième axe vertical lors de l'implémentation d'un graphique linéaire multi-axes et comment le personnaliser en japonais.

Environnement de développement

Ruby 2.5.1 Rails 5.2.4.4

Qu'est-ce que amCharts?

amCharts est une bibliothèque de dessin de graphes javascript qui peut dessiner différents types de graphes haute performance.

Référence officielle: https://www.amcharts.com/docs/v4/

Comme il y a peu d'informations en japonais, nous vous recommandons de vous référer à la référence officielle lors de la personnalisation.

Image complète

Actuellement, nous développons une application qui a une fonction pour enregistrer et représenter graphiquement le poids et le ratio de graisse corporelle. J'ai utilisé amCharts4 pour dessiner la date sur l'axe horizontal, le poids sur le premier axe vertical et le ratio de graisse corporelle sur le deuxième axe vertical sur un graphique.

Le graphique ci-dessous est l'image complète. ezgif-6-ef32c8681700.gif

Procédure de mise en œuvre / explication

Introduction d'amCharts

Veuillez consulter cet article pour savoir comment installer amCharts. Créer un graphique en utilisant amcharts 4 Demos

Créer un graphique lorsque les valeurs sur l'axe horizontal sont discontinues

Pour créer le graphique lorsque les valeurs sur l'axe horizontal de cet article sont discontinues, je me suis référé à l'article suivant. Créez un graphique linéaire en utilisant amCharts pour les valeurs affichées dans Rails à intervalles discontinus (dates, etc.).

Préparation des données de démonstration

Amorcez le fichier csv et préparez les données de démonstration suivantes.

id date weight body_fat_percentage
1 2020/06/08 72 15
2 ・ ・ ・ ・ ・ ・ ・ ・ ・

Exemple de code terminé

Je vais coller l'exemple de code avant l'explication. La description du côté Rails est omise cette fois.

record.html.erb
<style>
  #chartdiv {
    width: 700px;
    height: 300px;
  }
</style>

//Chargez le fichier JS requis
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>
<script src="//www.amcharts.com/lib/4/lang/ja_JP.js"></script>

<script>
am4core.ready(function() {

am4core.useTheme(am4themes_animated);

var chart = am4core.create("chartdiv", am4charts.XYChart);
chart.dateFormatter.language = new am4core.Language();
chart.dateFormatter.language.locale = am4lang_ja_JP;
chart.language.locale["_date_day"] = "MMMjj jour";
chart.language.locale["_date_year"] = "aaaa année";

const weights = <%== JSON.dump(@weights) %>;
const body_fat_percentages = <%== JSON.dump(@body_fat_percentages) %>;
const dates = <%== JSON.dump(@dates) %>;

var firstDate = new Date(dates[0])
var lastDate = new Date(dates.slice(-1)[0])
var termDate = (lastDate - firstDate) / 1000 / 60 / 60 / 24 + 1

function generateChartData() {
  var chartData = [];
  for (var j = 0; j < weights.length; j++ ) {
    for (var i = 0; i < termDate; i++ ) {
      var newDate = new Date(firstDate)
      newDate.setDate(newDate.getDate() + i);
      if ((new Date(dates[j])) - (newDate) == 0 ){
        weight = weights[j]
        body_fat_percentage = body_fat_percentages[j]
        chartData.push({
          date1: newDate,
          weight: weight,
          date2: newDate,
          body_fat_percentage: body_fat_percentage
        });
      }
    }
  }
  return chartData;
}

chart.data = generateChartData();

//Paramètres du titre du graphique
var title = chart.titles.create();
title.text = "Modifications du poids corporel et du taux de graisse corporelle"; //Paramètres du titre du graphique
title.fontSize = 15; //Définition de la taille de police du titre du graphique
//L'info-bulle affiche les paramètres de contenu à afficher lorsque le titre est survolé avec la souris
title.tooltipText = "Vous pouvez zoomer avec la barre de défilement."; 

//Réglage du premier axe horizontal
var dateAxis = chart.xAxes.push(new am4charts.DateAxis());
dateAxis.renderer.grid.template.location = 0;
dateAxis.renderer.labels.template.fill = am4core.color("#ffffff");

//Réglage du 2ème axe horizontal
var dateAxis2 = chart.xAxes.push(new am4charts.DateAxis());
dateAxis2.tooltip.disabled = true; //Paramètre de masquage de l'info-bulle
dateAxis2.renderer.grid.template.location = 0;
dateAxis2.renderer.labels.template.fill = am4core.color("#000000");

//Réglage du premier axe vertical
var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.tooltip.disabled = true;
valueAxis.renderer.labels.template.fill = am4core.color("#e59165");
valueAxis.renderer.minWidth = 60;
valueAxis.renderer.labels.template.adapter.add("text", function(text) {
  return text + "kg";
});
valueAxis.renderer.fontWeight = "bold"; //Changer la valeur de l'axe en gras

//Réglage du deuxième axe vertical
var valueAxis2 = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis2.tooltip.disabled = true;
valueAxis2.renderer.grid.template.strokeDasharray = "2,3";
valueAxis2.renderer.labels.template.fill = am4core.color("#dfcc64");
valueAxis2.renderer.minWidth = 60;
valueAxis2.renderer.labels.template.adapter.add("text", function(text) {
  return text + "%";
});
valueAxis2.renderer.opposite = true; //Réglez le deuxième axe vertical vers la droite
valueAxis2.renderer.fontWeight = "bold"; //Changer la valeur de l'axe en gras

//Définition de la valeur du premier axe vertical
var series = chart.series.push(new am4charts.LineSeries());
series.name = "poids";
series.dataFields.dateX = "date1";
series.dataFields.valueY = "weight";
series.tooltipText = "{valueY.value}kg";
series.fill = am4core.color("#e59165");
series.stroke = am4core.color("#e59165");
series.smoothing = "monotoneX";
series.strokeWidth = 2;

//Points de repère de la série(1er axe vertical)
var bullet = series.bullets.push(new am4charts.Bullet());
var circle = bullet.createChild(am4core.Circle);
circle.width = 5;
circle.height = 5;
circle.horizontalCenter = "middle";
circle.verticalCenter = "middle";

//Définition de la valeur du premier axe vertical
var series2 = chart.series.push(new am4charts.LineSeries());
series2.name = "Pourcentage de graisse corporelle";
series2.dataFields.dateX = "date2";
series2.dataFields.valueY = "body_fat_percentage";
series2.yAxis = valueAxis2;
series2.xAxis = dateAxis2;
series2.tooltipText = "{valueY.value}%"; //Paramètres d'affichage de la puce d'outil
series2.fill = am4core.color("#dfcc64"); //Couleur de la pointe de l'outil
series2.stroke = am4core.color("#dfcc64"); //Couleur de la ligne du graphique
series2.smoothing = "monotoneX";
series2.strokeWidth = 2;

//Points de repère de la série(2e axe vertical)
var bullet2 = series2.bullets.push(new am4charts.Bullet());
var circle2 = bullet2.createChild(am4core.Circle);
circle2.width = 5;
circle2.height = 5;
circle2.horizontalCenter = "middle";
circle2.verticalCenter = "middle";

chart.scrollbarX = new am4core.Scrollbar(); //Paramètres de la barre de défilement

//Définir le curseur
chart.cursor = new am4charts.XYCursor();
chart.cursor.xAxis = dateAxis2;

//Paramètres de la légende
chart.legend = new am4charts.Legend();
chart.legend.parent = chart.plotContainer;
chart.legend.zIndex = 100;
chart.legend.position = "top";
chart.legend.contentAlign = "right";

//Paramètres de ligne de grille
valueAxis2.renderer.grid.template.strokeOpacity = 0.07;
dateAxis2.renderer.grid.template.strokeOpacity = 0.07;
dateAxis.renderer.grid.template.strokeOpacity = 0.07;
valueAxis.renderer.grid.template.strokeOpacity = 0.07;

});
</script>

<div id="chartdiv"></div>

Commentaire

Réglage de plusieurs axes verticaux

Comme indiqué dans l'exemple de code, dans le cas d'un graphique multi-axes, il est nécessaire de définir chaque axe et chaque valeur. Définissez les paramètres tels que les données à utiliser pour chacun.

Localisation en japonais

Si l'axe horizontal est la date, la notation par défaut est américaine, elle sera donc en anglais comme indiqué ci-dessous. スクリーンショット 2020-10-25 22.02.52.png

Il n'y a pas de problème tel quel, mais si vous voulez écrire "◯ mois ◯ jour", ajoutez les paramètres suivants. Avec les paramètres de traduction standard, par exemple, «août» peut être traduit en «août», mais le nombre de jours n'est pas traduit par «XX jours», alors ajoutez vos propres règles comme suit. Vous pouvez faire la même chose pour l'année.

<script src="//www.amcharts.com/lib/4/lang/ja_JP.js"></script> //Appelez le fichier de paramètres régionaux
<script>
//Omission
chart.dateFormatter.language = new am4core.Language(); //Paramètres de traduction standard
chart.dateFormatter.language.locale = am4lang_ja_JP; //Paramètres de traduction standard
chart.language.locale["_date_day"] = "MMMjj jour";Écraser avec vos propres règles
chart.language.locale["_date_year"] = "aaaa année";Écraser avec vos propres règles
//Omission
</script>

[Lien de référence]  https://www.amcharts.com/docs/v4/concepts/locales/  https://github.com/amcharts/amcharts4/blob/master/src/lang/ja_JP.ts

Réglage du deuxième axe vertical

Avec les paramètres par défaut, le premier axe vertical et le deuxième axe vertical se trouvent sur le côté gauche. スクリーンショット 2020-10-25 22.14.34.png C'est un peu difficile à voir, donc si vous souhaitez modifier le deuxième axe vertical vers la droite, ajoutez les paramètres suivants.

valueAxis2.renderer.opposite = true; //Réglez le deuxième axe vertical vers la droite

Présentation d'autres paramètres supplémentaires

Des points de données peuvent être définis pour chaque série. Vous pouvez le changer en carré en changeant le cercle en carré.

var bullet = series.bullets.push(new am4charts.Bullet());
var circle = bullet.createChild(am4core.Circle);
circle.width = 5;
circle.height = 5;
circle.horizontalCenter = "middle";
circle.verticalCenter = "middle";

[Lien de référence]  https://www.amcharts.com/docs/v4/concepts/bullets/

series.smoothing = "monotoneX";
series2.fill = am4core.color("#dfcc64"); //Couleur de la pointe de l'outil
series2.stroke = am4core.color("#dfcc64"); //Couleur de la ligne du graphique

Résumé

Vous pouvez dessiner des graphiques haute performance à l'aide d'amCharts. Vous pouvez créer divers graphiques autres que le graphique linéaire. Il n'y a pas beaucoup d'informations en japonais, donc si vous souhaitez le personnaliser, nous vous recommandons de vous référer à la référence officielle.

URL de référence

Créer un graphique en utilisant amcharts 4 Demos Créez un graphique linéaire en utilisant amCharts pour les valeurs affichées dans Rails à intervalles discontinus (dates, etc.).

Recommended Posts

[Rails] Création du deuxième axe vertical et localisation japonaise dans le dessin graphique à l'aide d'amCharts4, etc.
Étendre les Highfaces pour inverser l'axe vertical du graphique
[Rails] Comment afficher les prévisions météo de l'adresse enregistrée en japonais en utilisant OpenWeatherMap
[Rails] Localisation japonaise du message d'erreur lors de l'utilisation de l'objet Form
[Rails] Localisation japonaise à l'aide de rails-i18n
[Rails] Localisation japonaise des messages d'erreur
[Rails] Paramètres de validation et localisation en japonais
Calculez le pourcentage de "bon", "normal" et "mauvais" dans le questionnaire à l'aide de SQL
Afficher le calendrier et le jour japonais en utilisant la classe standard java8
L'identité des paramètres de rails [: id]
Localisation japonaise de CentOS 8 et disposition du clavier japonais