Vegalite 日线图摆动

Vegalite daily line chart wobble

我 运行 遇到了 vegalite 的问题,图表显示 'wobbling line' 线条应该是直的,并且日期不是等距的。

任何人都可以验证这是一个错误,还是我的规范有误? .

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

要重现此问题,请将以下规范粘贴到 vega lite editor:

{
  "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')

摆动是由计算与数据值相关的像素坐标时的舍入误差影响造成的。

查看 vega-lite 生成的 vega 代码,可以看到定义的 scale"round": true 条目。将其更改为 false 解决了我屏幕上的问题,并使 vega-lite 做到这一点,也可以通过添加:

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

而不是

"config": [],

vega-lite 规范中的行。