4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PolarsAdvent Calendar 2024

Day 22

Polarsのplotを理解する

Last updated at Posted at 2024-12-22

Polars には df.plot... による可視化機能が存在します。データの前処理からスムーズにグラフ作成に繋げられ、データ確認に非常に便利です。

本記事では、そんな Polars の可視化機能の概要や使い方についてご紹介します。

まずは使い方を理解する

3行で理解するpolars.plot

基本的な使い方はシンプルで、データフレームに対して .plot を続けることでグラフ作成できます。

import polars as pl

# palmerpenguins のデータを利用
df = pl.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/refs/heads/master/penguins.csv")

# 散布図の作成
df.plot.point(x="bill_length_mm", y="bill_depth_mm", color="species")

image.png

描写できるグラフ一覧

現時点で実装されているグラフはそこまで多くないです1

  • .plot.bar
  • .plot.line
  • .plot.point.plot.scatter も同じ)

後述しますが、これらの組み合わせでヒストグラムなども作成できるため、これだけでもある程度は対応できる印象です。

インストール

pip で入ります。Google Colabだとデフォルトで必要なものがインストールされているので、そのまま使えます。

pip install polars[plot]

既に Polars のみ導入している場合、 altair>=5.4.0 をインストールすればOKです。

pip install altair

plot機能の中身を理解する

実は Polars の plot機能は、Altair のグラフ作成を呼び出しているだけです。

バックエンドに使われている Altair は、日本での知名度はそこまで高くないものの、使い勝手が良い可視化ライブラリです。Altair についてはこの記事の後半「Altairを理解する」で説明します。

なぜ Altair?

端的に言うと、Altair 側が Polars に対応しているからです。この公式のブログで紹介されていますが、その裏には Narwhals なるものが存在しています(こちらも後述の「Narwhalsを理解する」で簡単に解説します)。

という理由なので、将来的にバックエンドは変わる可能性は全然あります。

hvplot

実は最初はバックエンドがhvplot でした。ver 1.6.0 以降 Altair になったのですが、以下のように記述すると hvplot も使えます。

import hvplot.polars

df.hvplot.scatter(x="bill_length_mm", y="bill_depth_mm")

ちなみに hvplot は、複数のデータフレームライブラリから HoloView というラッパーを介してグラフを可視化するライブラリです。詳細は以下の記事などを参照ください。

なお、もちろん他の可視化ライブラリ(matplotlib, seaborn, plotlyなどなど)に Polars のデータフレームをインプットとして入れることはもちろん可能です。

ドキュメント

ユーザーガイド

APIリファレンス

Altair になった経緯に関する Blog

Altairを理解する

Altair は JavaScript のグラフ作成ライブラリである Vega-Lite に基づいて作られた Python ライブラリです。ドキュメントのタイトルに「A Grammar of Interactive Graphics」と書いているように、R の ggplot とかと似た書き味な気がします。Python だと seaborn (matplotlibではなく) や plotly.express (plotlyではなく) などと似た立ち位置です。

Altair の基本概念

※説明は「- Simple Charts: Core Concepts — Altair Tutorial」を参考にしています

image.png

  • Chart: グラフそのものを Chart オブジェクトと言い、その重要な要素が Data, Mark, Encoding の3つ
  • Data: 各行が観測値、各列が変数を表す「tidy」形式であることが推奨される
  • Mark: 基本的なグラフィックの要素
  • Encoding: DataのカラムをMarkの視覚的要素にマッピングさせる

Polars の .plot のなかだと以下で対応されます。

  • Data: 呼びだしている DataFrame
  • Mark: .plot に続けて記載(point, line, barのいずれか)
  • Encoding: 引数としてカラムを指定

Altairの便利機能など

Layered & Multi-View Charts

複数のグラフを重ねたり並べたりできる。

Line+Point+Barを重ねる

横に並べる

ちなみにこんな感じでシンプルに書けます

# 重ねる
fig1 + fig2

# 横に並べる
fig1 | fig2

# 縦に並べる
fig1 & fig2

Interactive Charts

操作性も柔軟に設定可能です。
これは実際に触ってもらうのが一番分かりやすいと思うので、当該のドキュメントをご覧ください。

Top-Level Chart Configuration

サイズや軸や凡例など、細かい調整はこのあたりにまとまってます。

Altairに関する参考リンク

上記紹介したもの以外にもいろいろ柔軟に設定可能です。3つ目の日本語記事はかなり詳細に解説してくれており、参考になりそうです。

Narwalsを理解する

上で述べたように、Polars の plot は Narwhals ライブラリが基盤になっています。

Narwhals は、pandas、Polars、cuDF などの異なるデータフレームライブラリ間の互換性を提供する軽量な Python ライブラリで、ライブラリ開発者がデータフレームに依存しないコードを記述することを支援します。

(なので私たちユーザーは Narwhals の存在を意識することなく、知らぬ間に恩恵を受ける類のものです。)

可視化スピードを検証する

Polars といえば Blazing Fast。ということで、ほかと比較してこの df.plot も高速かどうかを簡易的に検証してみます2

比較したもの

  • polars.plot
  • seaborn (polars)
  • plotly (polars)
  • pandas.plot
  • seaborn(pandas)
  • plotly(pandas)

設定として、時間がかかってストレスに感じることが多い、行数の多いデータの散布図の可視化を行います。

検証結果

image.png

そんなに polars の .plot が速いわけではないですね…

plotlyは内部的に一度 pandas に変換する処理で時間がかかってるとかでしょうか?

Exampleで理解する

実際に使っていくうえで直面しそうなグラフを例として記載します。

詳細はここを見るのが良きです。

histogram

image.png

import polara as pl
import altair as alt

df = pl.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/refs/heads/master/penguins.csv")

# 件数を縦軸にする(=ヒストグラムとして `bar` を作成)
fig1 = df.plot.bar(x="bill_length_mm", y="count()")

# 横軸をBinで切る
fig2 = df.plot.bar(
    alt.X("bill_length_mm:Q").bin().title('くちばしの長さ'),
    y="count()"
)

# 横に並べる
fig1 | fig2

サイズ変更

image.png

df.plot.point(
    # ゼロを初期描写範囲に含まない
    x=alt.X("bill_length_mm", scale=alt.Scale(zero=False)),
    y=alt.Y("bill_depth_mm", scale=alt.Scale(zero=False)),
    color=alt.Color('body_mass_g:Q').bin(maxbins=5)
).properties(
    # Chart自体のサイズ
    width=600,
    height=400 
).configure_axis(
    # 軸のフォントサイズ
    labelFontSize=20,
    titleFontSize=20,
).configure_legend(
    # 凡例のフォントサイズ
    labelFontSize=20,
    titleFontSize=20,
)

...他の例も追記予定です

終わりに

実は今回この記事を書くにあたって初めて Altair をちゃんと触ったのですが、なかなか良さそうでした。デフォルトの描画サイズが小さくて好みではないものの、それを除くと快適に使えそうです。

もともと Pandas はデータ加工よりもデータ可視化ライブラリとして有用だと思っていたのですが、これや df.style による GreatTables を用いた表の整形など機能が増えてきており、全て Polars で賄える状況になりつつある印象です。

ということで、みなさまも良い Polars ライフを!

  1. Altair側だとより多くのグラフ種類があります。https://altair-viz.github.io/user_guide/marks/index.html

  2. 適当に測っただけで、全くもって正確な検証ではありません。結果は信用しないでください。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?