Echarts实践:实现一个未来七天天气预报,图表轮播效果及插入svg或img图标

Posted 1024_Byte

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Echarts实践:实现一个未来七天天气预报,图表轮播效果及插入svg或img图标相关的知识,希望对你有一定的参考价值。

七天效果图

轮播效果图

 

 


轮播效果实现

   <el-button class="button" icon="el-icon-arrow-left" @click="backChart"></el-button>
      <v-chart :options="echartsOption" ref="rainChart" autoresize style="width:90%;" />
      <el-button class="button" icon="el-icon-arrow-right" @click="goChart"></el-button>


通过echarts配置项,设置数据缩放,并将缩放条隐藏

    echartsOption: 
        dataZoom: 
          show: false,
          startValue: 0,
          endValue: 6
        ,
    
 data() 
    return 
      chartData: [],
      startValue: 0,
      endValue: 6,
  


当点击轮播按钮时,通过修改data中的轮播索引,来调整缩放数据的区域从而实现数据滚动的效果

 goChart() 
      this.startValue++
      this.endValue++
      if (this.endValue > this.chartData.length - 1) 
        this.startValue = this.chartData.length - 7
        this.endValue = this.chartData.length - 1
       else if (this.startValue < 1) 
        this.startValue = 0
        this.endValue = 6
      
      this.$nextTick(() => 
        this.init()
      )
    ,
    backChart() 
      this.startValue--
      this.endValue--
      if (this.startValue < 1) 
        this.startValue = 0
        this.endValue = 6
      
      this.$nextTick(() => 
        this.init()
      )
    ,

插入svg图标或img图片


这里我使用的时和风天气的图标,下载到本地的svg
想要插入多个本地图标这里只能通过rich的方式去引入,但是因为我的这里的图标是动态的因此不能提前声明

   series: [
          
            data: [],
            type: 'line',
            label: 
              normal: 
                show: true,
                //预留rich对象
                rich: ,
                formatter: function(param) 
                  var res = ''
                  res += `img$param.data.icon|` + '\\n ' + (param.data.text.length > 1 ? param.data.text : ' ' + param.data.text) + '\\n' + param.value + '°C'
                  return res
                ,
              
            
          
        ]


我们通过接口返回的icon数值去设置不同的img名称

  this.echartsOption.series[0].label.normal.rich[`img$this.chartData[i].icon`] = 
          color: '#1890ff',
          backgroundColor: 
            image: require(`../../assets/icons/$this.chartData[i].icon.svg`)
          ,
          width: 40,
          align: 'center',
          height: 40
        


重点!!因为data正常为数组,因此不能在formater中识别icon内容,这里我们通过对象的形式传入,value默认为data渲染的值

 series.push( value: this.chartData[i].temp, text: this.chartData[i].text, icon: this.chartData[i].icon )


这样,我们可以通过param的data对象来获取我们传入的想要的数据值,使echarts数据使用更灵活

formatter: function(param) 
                  var res = ''
                  res += `img$param.data.icon|` + '\\n ' + (param.data.text.length > 1 ? param.data.text : ' ' + param.data.text) + '\\n' + param.value + '°C'
                  return res
                ,


未来七天效果


未来七天的实现重点在于 顶部的图标和内容信息如何实现
这里我通过声明一个空的柱状图,并将他的提示内容向上偏移了-450像素,从而让文字达到图表顶端

 
            type: 'bar',
            name: '柱状图',
            label: 
              normal: 
                align: 'center',
                color: '#fff',
            // 偏移柱状图
                offset: [0, -450],
                show: true,
                rich: ,
                textStyle: 
                  fontSize: '18'
                
              
            ,


但是柱状图会始终存在,我偷了个懒将柱状图设置为背景色从而隐藏柱状图的显示

   itemStyle: 
              normal: 
                color: '#246EAD'
              
            


最后仍然通过修改rich和传入data对象,来实现顶部信息的格式化

  for (let i = 0; i < this.chartData.length; i++) 
        series0.push(this.chartData[i].tempMax)
        series1.push(this.chartData[i].tempMin)
        // xAxis.push(moment( this.chartData[i].tm).format('HH:mm'))
        xAxis.push(this.chartData[i].fxDate)
        bar.push( value: 9, textDay: this.chartData[i].textDay, iconDay: this.chartData[i].iconDay, fxDate: this.chartData[i].fxDate )
        this.echartsOption.series[2].label.normal.rich[`img$this.chartData[i].iconDay`] = 
          color: '#1890ff',
          align: 'center',
          backgroundColor: 
            image: require(`../../assets/icons/$this.chartData[i].iconDay.svg`)
          ,
          width: 40,
          height: 40
        
        max.push(this.chartData[i]['tempMax'])
        min.push(this.chartData[i]['tempMin'])
      


注意保证Y轴长度始终固定,防止图表变形或偏移

  this.echartsOption.yAxis.max = Math.max(...max)
      this.echartsOption.yAxis.min = Math.min(...min)
      if (this.echartsOption.yAxis.max - this.echartsOption.yAxis.min != 50) 
        this.echartsOption.yAxis.max = (50 - (this.echartsOption.yAxis.max - this.echartsOption.yAxis.min)) + this.echartsOption.yAxis.max
      


最后添加今天明天的判断实现最终效果

  formatter: function(param) 
                  var res = ''
                  var weekDay = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
                  var myDate = new Date(Date.parse(param.data.fxDate))
                  if (param.dataIndex === 0) 
                    res += '今天' + '\\n' + param.data.fxDate + '\\n' + '\\n' + `img$param.data.iconDay|` + '\\n' + param.data.textDay
                   else if (param.dataIndex === 1) 
                    res += '明天' + '\\n' + param.data.fxDate + '\\n' + '\\n' + `img$param.data.iconDay|` + '\\n' + param.data.textDay
                   else 
                    res += weekDay[myDate.getDay()] + '\\n' + param.data.fxDate + '\\n' + '\\n' + `img$param.data.iconDay|` + '\\n' + param.data.textDay
                  
                  return res
                ,

以上是关于Echarts实践:实现一个未来七天天气预报,图表轮播效果及插入svg或img图标的主要内容,如果未能解决你的问题,请参考以下文章

免费的天气预报Api都有哪些

如何使用 React Hooks 和 OpenWeatherMap API 获取 5 天天气预报

如何用js调用天气预报代码 最新

用Python获取黄石市近7天天气预报

如何使用中国气象局API开发天气APP

如何在网页中显示天气预报