Графики Altair mark_line шумнее, чем matplotlib? - PullRequest
1 голос
/ 21 мая 2019

Я учу Альтаира, чтобы добавить интерактивность на мои сюжеты.Я пытаюсь воссоздать сюжет, который я делаю в 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

Как убрать шум с альтаира?

1 Ответ

1 голос
/ 21 мая 2019

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

enter image description here

Лучший способ исправить это - установить кодировку detail для столбца, который различает различные линии, которые вы хотели бы нарисовать по отдельности:

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

enter image description here

Если важна не группировка, а порядок точек, вы можете указать это, указав канал заказа :

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

enter image description here

Обратите внимание, что две линии соединены на правом конце. Это фактически то, что 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'
)

enter image description here

Несколько линий в каждой группе нарисованы в порядке, связанном на концах, так же, как они находятся в matplotlib.

...