Vegalite每日线图摆动

时间:2017-04-01 13:18:13

标签: vega vega-lite altair

我遇到了一个vegalite的问题,当图表线应该是直线时,图表会显示“摆动线”,并且日期不是等间距。

任何人都可以验证这是一个错误,还是我在我的规范中犯了错误? enter image description here

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

要复制此问题,请将以下规范粘贴到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')

1 个答案:

答案 0 :(得分:2)

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

查看vega生成的vega-lite代码,可以看到定义的"round": true的{​​{1}}条目。将此更改为scale可以解决我的屏幕上的问题,并通过添加以下内容false来执行此操作:

vega-lite

而不是

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

"config": [], 规范中的行