Matplotlib リボンボックス

PythonPythonBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Matplotlibは、Python用の人気のあるデータ可視化ライブラリです。このチュートリアルでは、データを可視化する独特な方法であるリボンボックスチャートを作成する方法を案内します。リボンボックスチャートは、各バーが「リボンのような」形状をしていて、グラデーションカラースキームを持つ積み上げ棒グラフです。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

Jupyter Notebookの読み込みには数秒かかる場合があります。Jupyter Notebookの制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。私たちは迅速に問題を解決いたします。

ライブラリのインポートとデータの読み込み

このステップでは、必要なライブラリをインポートしてデータを読み込みます。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cbook
from matplotlib import colors as mcolors
from matplotlib.image import AxesImage
from matplotlib.transforms import Bbox, BboxTransformTo, TransformedBbox

RibbonBoxクラスの作成

このステップでは、リボンボックスのグラデーションカラーを作成するために使用されるRibbonBoxクラスを作成します。

class RibbonBox:
    ## リボンボックス画像を読み込む
    original_image = plt.imread(cbook.get_sample_data("Minduka_Present_Blue_Pack.png"))
    cut_location = 70
    b_and_h = original_image[:, :, 2:3]
    color = original_image[:, :, 2:3] - original_image[:, :, 0:1]
    alpha = original_image[:, :, 3:4]
    nx = original_image.shape[1]

    def __init__(self, color):
        rgb = mcolors.to_rgb(color)
        self.im = np.dstack([self.b_and_h - self.color * (1 - np.array(rgb)), self.alpha])

    def get_stretched_image(self, stretch_factor):
        stretch_factor = max(stretch_factor, 1)
        ny, nx, nch = self.im.shape
        ny2 = int(ny*stretch_factor)
        return np.vstack([self.im[:self.cut_location],
                          np.broadcast_to(self.im[self.cut_location], (ny2 - ny, nx, nch)),
                          self.im[self.cut_location:]])

RibbonBoxImageクラスの作成

このステップでは、実際のリボンボックスを作成するために使用されるRibbonBoxImageクラスを作成します。

class RibbonBoxImage(AxesImage):
    zorder = 1

    def __init__(self, ax, bbox, color, *, extent=(0, 1, 0, 1), **kwargs):
        super().__init__(ax, extent=extent, **kwargs)
        self._bbox = bbox
        self._ribbonbox = RibbonBox(color)
        self.set_transform(BboxTransformTo(bbox))

    def draw(self, renderer, *args, **kwargs):
        stretch_factor = self._bbox.height / self._bbox.width

        ny = int(stretch_factor*self._ribbonbox.nx)
        if self.get_array() is None or self.get_array().shape[0]!= ny:
            arr = self._ribbonbox.get_stretched_image(stretch_factor)
            self.set_array(arr)

        super().draw(renderer, *args, **kwargs)

チャートの作成

このステップでは、リボンボックスを作成するためにRibbonBoxImageクラスを使用して、実際のチャートを作成します。

def main():
    fig, ax = plt.subplots()

    years = np.arange(2004, 2009)
    heights = [7900, 8100, 7900, 6900, 2800]
    box_colors = [(0.8, 0.2, 0.2),
                  (0.2, 0.8, 0.2),
                  (0.2, 0.2, 0.8),
                  (0.7, 0.5, 0.8),
                  (0.3, 0.8, 0.7)]

    for year, h, bc in zip(years, heights, box_colors):
        bbox0 = Bbox.from_extents(year - 0.4, 0., year + 0.4, h)
        bbox = TransformedBbox(bbox0, ax.transData)
        ax.add_artist(RibbonBoxImage(ax, bbox, bc, interpolation="bicubic"))
        ax.annotate(str(h), (year, h), va="bottom", ha="center")

    ax.set_xlim(years[0] - 0.5, years[-1] + 0.5)
    ax.set_ylim(0, 10000)

    ## 背景グラデーションを作成する
    background_gradient = np.zeros((2, 2, 4))
    background_gradient[:, :, :3] = [1, 1, 0]
    background_gradient[:, :, 3] = [[0.1, 0.3], [0.3, 0.5]]
    ax.imshow(background_gradient, interpolation="bicubic", zorder=0.1,
              extent=(0, 1, 0, 1), transform=ax.transAxes, aspect="auto")

    plt.show()

main()

チャートの理解

このステップでは、作成したチャートについて説明します。このチャートは、重ねられたリボンボックスで構成されており、棒グラフを形成しています。各リボンボックスの高さは、データセット内の値に対応しています。リボンボックスはグラデーションカラースキームを持ち、視覚的に魅力的です。

まとめ

このチュートリアルでは、Matplotlibを使ってリボンボックスチャートを作成する方法を学びました。それぞれグラデーションカラーと実際のリボンボックスを作成するために、RibbonBox クラスと RibbonBoxImage クラスを作成しました。そして、これらのクラスを使って、重ねられたリボンボックスで構成される棒グラフを形成するチャートを作成しました。