matplotlib + Ibis

If you don’t have data to visualize, you can load an example table:

Code
import ibis
import ibis.selectors as s

ibis.options.interactive = True

t = ibis.examples.penguins.fetch()
t.head(3)
┏━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓
┃ species  island     bill_length_mm  bill_depth_mm  flipper_length_mm  body_mass_g  sex     year  ┃
┡━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩
│ stringstringfloat64float64int64int64stringint64 │
├─────────┼───────────┼────────────────┼───────────────┼───────────────────┼─────────────┼────────┼───────┤
│ Adelie Torgersen39.118.71813750male  2007 │
│ Adelie Torgersen39.517.41863800female2007 │
│ Adelie Torgersen40.318.01953250female2007 │
└─────────┴───────────┴────────────────┴───────────────┴───────────────────┴─────────────┴────────┴───────┘

Using matplotlib with Ibis

Refer to the matplotlib documentation. matplotlib has not implemented the dataframe interchange protocol so it is recommended to call to_pandas() on the Ibis table before plotting.

import matplotlib.pyplot as plt

grouped = t.group_by("species").aggregate(count=ibis._.count())
grouped = grouped.mutate(row_number=ibis.row_number().over()).select(
    "row_number",
    (
        ~s.c("row_number") & s.all()
    ),  # see https://github.com/ibis-project/ibis/issues/6803
)
grouped
┏━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ row_number  species    count ┃
┡━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
│ int64stringint64 │
├────────────┼───────────┼───────┤
│          0Adelie   152 │
│          1Chinstrap68 │
│          2Gentoo   124 │
└────────────┴───────────┴───────┘
# https://stackoverflow.com/questions/9101497/matplotlib-bar-graph-x-axis-wont-plot-string-values
plt.figure(figsize=(6, 4))
plt.bar(grouped["row_number"].to_pandas(), grouped["count"].to_pandas())
plt.title("Penguin species counts")
plt.xlabel("Species")
plt.xticks(grouped["row_number"].to_pandas(), grouped["species"].to_pandas())
plt.ylabel("Count")
plt.show()

Back to top