Altair mark_line 的绘图比 matplotlib 更嘈杂?

Posted

技术标签:

【中文标题】Altair mark_line 的绘图比 matplotlib 更嘈杂?【英文标题】:Altair mark_line plots noisier than matplotlib? 【发布时间】:2019-10-07 12:36:25 【问题描述】:

我正在学习 altair 来为我的情节添加交互性。我正在尝试重新创建我在 matplotlib 中所做的绘图,但是 altair 正在为我的曲线添加噪音。

这是我的数据集 df1

从 github 链接到这里:https://raw.githubusercontent.com/leoUninova/Transistor-altair-plots/master/df1.csv

这是代码:

fig, ax = plt.subplots(figsize=(8, 6))
for key, grp in df1.groupby(['Name']): 
  y=grp.logabsID
  x=grp.VG

  ax.plot(x,  y,  label=key)
plt.legend(loc='best')
plt.show()


#doing it directly from link
df1='https://raw.githubusercontent.com/leoUninova/Transistor-altair-plots/master/df1.csv'


import altair as alt
alt.Chart(df1).mark_line(size=1).encode(
    x='VG:Q',
    y='logabsID:Q',
    color='Name:N'
)


这是我正在生成的地块的图像: matplotlib vs altair plot

如何消除 altair 的噪音?

【问题讨论】:

我认为这不是噪音,请发布您的数据集。 我在 github 上创建了一个新文件 df1,这是正确的子集并使其可重现:raw.githubusercontent.com/leoUninova/Transistor-altair-plots/… 我认为该错误可能与单行每行有 2 个点有关VG值? 【参考方案1】:

Altair 在绘制线条之前先对 x 轴进行排序,因此如果您在一组中有多条线条,通常会导致您所说的“噪音”。这不是噪音,而是以默认排序顺序显示的数据集中所有点的准确表示。这是一个简单的例子:

import numpy as np
import pandas as pd
import altair as alt

df = pd.DataFrame(
    'x': [1, 2, 3, 4, 5, 5, 4, 3, 2, 1],
    'y': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'group': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
)

alt.Chart(df).mark_line().encode(
    x='x:Q',
    y='y:Q'
)

解决此问题的最佳方法是将detail 编码设置为一个列,以区分您希望单独绘制的不同线条:

alt.Chart(df).mark_line().encode(
    x='x:Q',
    y='y:Q',
    detail='group:N'
)

如果重要的不是分组,而是点的顺序,您可以通过提供order channel 来指定:

alt.Chart(df.reset_index()).mark_line().encode(
    x='x:Q',
    y='y:Q',
    order='index:Q'
)

请注意,两条线在右端相连。这实际上是 matplotlib 默认所做的:即使有重复数据,它也会保持索引顺序。为您的数据使用订单渠道会产生您正在寻找的结果:

df1 = pd.read_csv('https://raw.githubusercontent.com/leoUninova/Transistor-altair-plots/master/df1.csv')

alt.Chart(df1.reset_index()).mark_line(size=1).encode(
    x='VG:Q',
    y='logabsID:Q',
    color='Name:N',
    order='index:Q'
)

每组中的多条线按照末端连接的顺序绘制,就像在 matplotlib 中一样。

【讨论】:

以上是关于Altair mark_line 的绘图比 matplotlib 更嘈杂?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 altair 图表显示一个字段的数据框?

如何使 Altair 绘图响应

使用 Altair 和 Jupyter 绘图时如何在轴标签中显示希腊字母?

altair 的累积计数

如何将图像上的绘图线保存为 .mat 文件

6opencv入门Mat类介绍,基本的绘图函数