Data formats#

Gufo accepts data in several formats and resolves them transparently. You never need to convert your data before passing it in.

pandas DataFrame#

The most common case. Pass the DataFrame to gufo.chart(), then refer to columns by name.

import gufo
import pandas as pd

df = pd.read_csv("data.csv")
gufo.chart(df).scatter("x", "y").show()

Long-form DataFrames#

Long-form (tidy) data has one row per observation. Group by a column using color=.

gufo.chart(long_df).line("year", "revenue", color="product").legend().show()

Wide-form DataFrames#

Wide-form data works without reshaping. Pass a list of column names as y.

wide_df = pd.DataFrame({
    "month": ["Jan", "Feb", "Mar", "Apr"],
    "north": [120, 135, 118, 142],
    "south": [98,  102, 110, 107],
    "east":  [85,  91,  88,  96],
})

gufo.chart(wide_df).line("month", ["north", "south", "east"]).legend().show()

Polars DataFrame#

Polars works exactly like pandas — pass a Polars DataFrame to gufo.chart() and refer to columns by name.

import polars as pl

df = pl.read_csv("data.csv")
gufo.chart(df).scatter("x", "y").show()

Install with pip install gufo[polars].

dict#

Pass a plain Python dict. Keys become column names.

gufo.chart({"x": [1, 2, 3], "y": [4, 5, 6]}).scatter("x", "y").show()

Arrays and lists#

When your data is already in arrays or lists, omit the data argument entirely and pass the arrays directly to the mark method.

import numpy as np

xs = np.arange(100)
ys = np.random.cumsum(np.random.randn(100))

gufo.chart().line(xs, ys).show()
gufo.chart().scatter([1, 2, 3], [4, 5, 6]).show()

Mixing arrays and column names#

You can overlay a computed series on a DataFrame-backed chart by passing arrays directly to a second mark.

import numpy as np

# Fit a trend line to data in the DataFrame
trend = np.polyval(np.polyfit(df["x"], df["y"], 1), df["x"])

(
    gufo.chart(df)
    .scatter("x", "y", alpha=0.5, label="Data")
    .line(df["x"].values, trend, color="red", label="Trend")
    .legend()
    .show()
)