Vue と Echarts を使った天気トレンドチャート

JavaScriptBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、都市の一年間の気温データを表示する天気トレンドチャートを作成する方法を学びます。このチャートを使えば、ユーザーは当月のデータと次の 7 日間のデータを切り替えることができ、天気トレンドの包括的なビューを提供します。

👀 プレビュー

「当月」と「次の 7 日間」の切り替え効果を以下の図に示します。

画像の説明

月の切り替え効果は以下の通りです。

画像の説明

🎯 タスク

このプロジェクトで学ぶことは以下の通りです。

  • Axios を使って JSON ファイルから天気データを取得する方法
  • 月のリストをレンダリングし、クリックイベントを処理して表示されるデータを変更する方法
  • 当月のデータと次の 7 日間のデータを切り替えるためのタブを実装する方法
  • 天気データを表示するために Echarts チャートを初期化してカスタマイズする方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • Axios を使って JSON ファイルからデータを取得する
  • Vue.js を使って応答性とインタラクティブなユーザーインターフェイスを作成する
  • Echarts を使って高度な機能を備えたカスタマイズされたチャートを作成する
  • ユーザーインタラクションを処理し、それに応じてチャートを更新する
  • フロントエンド開発、データ可視化、ユーザーエクスペリエンスデザインの知識を適用する

プロジェクト構造をセットアップする

このステップでは、プロジェクトファイルと構造をセットアップします。以下の手順に従ってこのステップを完了してください。

プロジェクトフォルダを開きます。ディレクトリ構造は以下の通りです。

├── css
│   └── style.css
├── js
│   ├── axios.js
│   ├── echarts.min.js
│   ├── vue.min.js
│   └── weather.json
└── index.html

ここで:

  • css/style.css はスタイルファイルです。
  • js/axios.js は axios ファイルです。
  • js/vue.min.js は vue2.x ファイルです。
  • js/echarts.min.js は echarts ファイルです。
  • js/weather.json は要求に必要な天気データです。
  • index.html はメインページです。

WebIDE の右下隅にある Go Live ボタンをクリックして、プロジェクトを実行します。

次に、VM の上部にある「Web 8080」を開き、手動で更新するとページが表示されます。

画像の説明

天気データを取得する

このステップでは、提供された JSON ファイルから天気データを取得する方法を学びます。

  1. index.html ファイルで、ファイルの下部にある <script> タグを探します。
  2. <script> タグの中で、new Vue() を使って新しい Vue インスタンスを作成します。
  3. Vue インスタンスの data オプションの中で、以下の属性を追加して初期値を割り当てます。
data: {
  //...
  data: [],
  yData: [],
  xData: [],
},
  1. Vue インスタンスの methods フックの中で、initChart 関数の中の this.chartOptions を探して、xAxis と series の data をそれぞれ対応する変数に変更します。以下のようになります。
this.chartOptions = {
  //...
  xAxis: [
    {
      //...
      data: this.xData
    }
  ],
  //...
  series: [
    {
      //...
      data: this.yData
    }
  ]
};
  1. Vue インスタンスの mounted フックの中で、axios.get() メソッドを使って ./js/weather.json ファイルから天気データを取得します。修正後のコードは以下の通りです。
mounted: async function () {
  const res = await axios.get("./js/weather.json");
  this.data = res.data;
  this.yData = res.data[0]["January"];
  this.xData = [...this.yData.map((e, i) => i + 1)];
  this.$nextTick(() => {
    this.initChart();
  });
},

このコードは JSON ファイルから天気データを取得し、data プロパティに保存し、その後チャート用の初期の yDataxData プロパティを設定します。最後に、チャートを描画するために initChart() メソッドを呼び出します。

月のリストをレンダリングする

このステップでは、月のリストをレンダリングし、クリックイベントを処理して表示されるデータを変更する方法を学びます。

  1. index.html ファイルで、Vue インスタンスの data オプションの中で、以下の属性を追加して初期値を割り当てます。
data: {
  //...
  monthName: "January",
  monthNumber: 0,
},
  1. class="month"<ul> 要素の中で、v-for ディレクティブを使って月のリストをレンダリングします。<li> 要素にクリックイベントハンドラを追加して、月がクリックされたときに changeMonth() メソッドを呼び出します。
<ul>
  <li
    v-for="(item,key,index) in monthList"
    :class="[monthName===key?'active':'']"
    @click="changeMonth(key,index)"
  >
    {{item}}
  </li>
</ul>
  1. Vue インスタンスの methods セクションの中で、changeMonth() メソッドを追加します。このメソッドは選択された月に基づいて monthNamemonthNumberyData、および xData プロパティを更新し、その後チャートを再レンダリングするために initChart() メソッドを呼び出します。
changeMonth(month, index) {
  this.monthName = month;
  this.monthNumber = index;

  this.yData = this.data[index][month];
  this.xData = [...this.yData.map((e, i) => i + 1)];

  if (index === this.nowMonth) {
    this.type = 1;
  }
  this.initChart();
},

当月と次の 7 日間のタブを実装する

このステップでは、ユーザーが当月のデータと次の 7 日間のデータを切り替えることができるタブを実装する方法を学びます。

  1. index.html ファイルで、Vue インスタンスの data セクションに、以下のプロパティを追加します。
data: {
  type: 1, // 次の 7 日間と当月のデータの状態
  nowMonth: new Date().getMonth(),
},
  1. id="currentMonth"<div> に、monthNumbernowMonth プロパティに基づいた条件付きレンダリングを追加します。これにより、当月のタブのみが表示されます。
<div id="currentMonth" v-if="monthNumber===nowMonth">
  <div class="title">
    <h3>{{typeTitle}}</h3>
    <div class="type" @click="clickType($event)">
      <span id="seven" :class="{'active':!type}">The next 7 days</span>
      <span id="current" :class="{'active':type}">The current month</span>
    </div>
  </div>
</div>
  1. Vue インスタンスの methods セクションに、clickType() メソッドを追加します。このメソッドは、クリックされたタブに基づいて typetypeTitleyData、および xData プロパティを更新し、その後チャートを再レンダリングするために initChart() メソッドを呼び出します。
clickType(e) {
  switch (e.target.id) {
    case "seven":
      this.type = 0;
      this.typeTitle = "The next 7 days";
      [this.xData, this.yData] = this.getSevenData();
      break;
    case "current":
      this.type = 1;
      this.typeTitle = "The current month";
      this.yData = this.data[this.monthNumber][this.monthName];
      this.xData = [...this.yData.map((e, i) => i + 1)];
      break;
  }
  this.initChart();
},
  1. getSevenData() メソッドを追加します。このメソッドは、次の 7 日間の x 軸のラベルと y 軸のデータを計算します。
getSevenData() {
  let newXdata = [],
    newYdata = [];
  for (let i = 0; i < 7; i++) {
    let now = new Date();
    let time = now.getTime() + 1000 * 60 * 60 * 24 * i;
    now.setTime(time);
    newXdata.push(`${now.getMonth() + 1}/${now.getDate()}`);

    if (this.monthNumber === now.getMonth()) {
      newYdata.push(this.yData[now.getDate() - 1]);
    } else {
      let nextMonth = this.data[now.getMonth()];
      for (const key in nextMonth) {
        newYdata.push(nextMonth[key][now.getDate() - 1]);
      }
    }
  }
  return [newXdata, newYdata];
},

このメソッドは、月の切り替えを考慮して、次の 7 日間の x 軸のラベルと y 軸のデータを計算します。

  1. ファイルを保存し、ページを再読み込みして更新されたチャートを確認します。以下の図は、「当月」と「次の 7 日間」を切り替えた際の効果を示しています(時間関数を通じて取得したもので、ここでは 4 月を想定)。

画像の説明

月の切り替え効果は以下の通りです。

画像の説明

まとめ

おめでとうございます!このプロジェクトを完了しました。実験技術を向上させるために、LabEx でさらに多くの実験を行ってみましょう。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習