4

我遇到了 vegalite 的问题,即当线条应该是直的并且日期不等间距时,图表会出现“摇摆线”。

任何人都可以验证这是一个错误,还是我在规范中犯了错误? 在此处输入图像描述.

我发现当您增加数据点的数量时,这个问题会变得更加严重。

要复制此问题,请将以下规范粘贴到vega lite 编辑器中:

{
  "description": "",
  "data": {
    "values": [
      {
        "date": "2017-01-23",
        "value": 100
      },
      {
        "date": "2017-01-24",
        "value": 200
      },
      {
        "date": "2017-01-25",
        "value": 300
      },
      {
        "date": "2017-01-26",
        "value": 400
      },
      {
        "date": "2017-01-27",
        "value": 500
      },
      {
        "date": "2017-01-28",
        "value": 600
      },
      {
        "date": "2017-01-29",
        "value": 700
      },
      {
        "date": "2017-01-30",
        "value": 800
      },
      {
        "date": "2017-01-31",
        "value": 900
      },
      {
        "date": "2017-02-01",
        "value": 1000
      },
      {
        "date": "2017-02-02",
        "value": 1100
      },
      {
        "date": "2017-02-03",
        "value": 1200
      },
      {
        "date": "2017-02-04",
        "value": 1300
      },
      {
        "date": "2017-02-05",
        "value": 1400
      },
      {
        "date": "2017-02-06",
        "value": 1500
      },
      {
        "date": "2017-02-07",
        "value": 1600
      }
    ]
  },
  "mark": "line",
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal"
    },
    "y": {
      "field": "value"
    }
  },
  "config": [],
  "embed": {
    "renderer": "canvas",
    "actions": {
      "export": false,
      "source": false,
      "editor": false
    }
  }
}

编辑:后续 - 在 Altair 中进行实验,似乎与日期方面无关。以下两个代码块都会遇到相同的问题:

import pandas as pd
import numpy as np
from altair import *

s1 = pd.date_range(start="2017-01-23", end="2020-02-07")
s2  = np.arange(1,len(s1)+1)*100
df = pd.DataFrame({"date":s1, "value":s2})

Chart(df).mark_line(
).encode(
    x='date',
    y='value'
)

import pandas as pd
import numpy as np
from altair import *

s1 = np.arange(1,1000,1)
s2  = np.arange(1,len(s1)+1)*100
df = pd.DataFrame({"x":s1, "value":s2})

Chart(df).mark_line(
).encode(
    x='x',
    y='value'
)

相反,以下产生了一个平滑的图(pandas 和 matplotlib):

%matplotlib inline
df.plot('date', 'value')
4

1 回答 1

3

摆动是由在计算与数据值相关的像素坐标期间舍入误差的影响引起的。

查看由vega生成的代码vega-lite,可以看到定义的 s的"round": true条目。scale更改它以false解决我屏幕上的问题,并且vega-lite可以通过添加:

"config": {"scale": {"round" : false}},

而不是

"config": [],

vega-lite规范中的行。

于 2017-04-01T14:28:05.290 回答