Altair mark_line 绘图比 matplotlib 更嘈杂?
Altair mark_line plots noisier than matplotlib?
我正在学习 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 的噪音?
Altair 在绘制线条之前对 x 轴进行排序,因此如果您在一组中有多条线条,它通常会导致 "noise",如您所说。这不是噪音,而是以默认排序顺序显示的数据集中所有点的准确表示。这是一个简单的例子:
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 来为我的绘图添加交互性。我正在尝试重新创建我在 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 的噪音?
Altair 在绘制线条之前对 x 轴进行排序,因此如果您在一组中有多条线条,它通常会导致 "noise",如您所说。这不是噪音,而是以默认排序顺序显示的数据集中所有点的准确表示。这是一个简单的例子:
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中一样。