📊 ステップ38: 様々なグラフを描いてみよう
棒グラフ、散布図、ヒストグラム、円グラフをマスター!
ステップ35〜37で折れ線グラフと日本語フォントの設定を学びました。今回は棒グラフ、散布図、ヒストグラム、円グラフの4種類のグラフを学び、データに合わせて使い分けられるようになりましょう。
📖 このステップで学ぶこと
・棒グラフ(plt.bar):カテゴリ間の比較
・散布図(plt.scatter):2つの変数の関係
・ヒストグラム(plt.hist):データの分布
・円グラフ(plt.pie):割合・構成比
🎯 1. グラフの種類と使い分け
データの種類や見せたい内容によって、適切なグラフが変わります。グラフを選ぶときの目安を覚えましょう。
📌 グラフの使い分け
| グラフの種類 | 関数 | 使う場面 |
| 折れ線グラフ | plt.plot() | 時間の変化、推移を見る |
| 棒グラフ | plt.bar() | カテゴリ間の比較、ランキング |
| 散布図 | plt.scatter() | 2つの変数の関係性を見る |
| ヒストグラム | plt.hist() | データの分布を見る |
| 円グラフ | plt.pie() | 割合、構成比を見る |
📊 2. 棒グラフ(Bar Chart)
棒グラフは、カテゴリごとの値を棒の高さで比較するグラフです。「どの商品が一番売れているか」「どの月の売上が高いか」などを比較するときに使います。
🔰 基本的な棒グラフ
コード:基本的な棒グラフ
import matplotlib.pyplot as plt
# データの準備
products = ['商品A', '商品B', '商品C', '商品D', '商品E']
sales = [120, 150, 90, 180, 110]
# 棒グラフを描く
plt.bar(products, sales)
plt.title('商品別売上')
plt.xlabel('商品')
plt.ylabel('売上(万円)')
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
plt.bar(products, sales)
・plt.bar():棒グラフを描く関数
・第1引数:X軸のカテゴリ(商品名)
・第2引数:棒の高さ(売上)
plt.plot()が折れ線グラフだったのに対し、plt.bar()は棒グラフを描きます。
実行結果
縦の棒グラフが表示されます。各商品の売上を棒の高さで比較できます。
📝 棒の色と枠線を設定する
コード:色と枠線を指定
import matplotlib.pyplot as plt
products = ['商品A', '商品B', '商品C', '商品D', '商品E']
sales = [120, 150, 90, 180, 110]
# 色と枠線を指定
plt.bar(products, sales, color='skyblue', edgecolor='black')
plt.title('商品別売上', fontsize=16)
plt.xlabel('商品', fontsize=12)
plt.ylabel('売上(万円)', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 新しいパラメータの解説
color=’skyblue’:棒の塗りつぶし色を水色に
edgecolor=’black’:棒の枠線を黒に
plt.grid(axis=’y’):Y軸方向のみグリッド線を表示
枠線をつけると、棒の境界がはっきりして見やすくなります。
📌 plt.bar()のパラメータ一覧
| パラメータ | 説明 | 例 |
| color | 棒の色 | ‘skyblue’, ‘red’, ‘#FF5733’ |
| edgecolor | 棒の枠線の色 | ‘black’, ‘gray’ |
| width | 棒の幅(デフォルト0.8) | 0.5, 0.6 |
| alpha | 透明度(0〜1) | 0.7 |
📝 横向きの棒グラフ
項目名が長い場合は、横向きの棒グラフが見やすいです。
コード:横向きの棒グラフ
import matplotlib.pyplot as plt
products = ['商品A', '商品B', '商品C', '商品D', '商品E']
sales = [120, 150, 90, 180, 110]
# barh()で横向きの棒グラフ
plt.barh(products, sales, color='lightgreen', edgecolor='black')
plt.title('商品別売上', fontsize=16)
plt.xlabel('売上(万円)', fontsize=12)
plt.ylabel('商品', fontsize=12)
plt.grid(axis='x', linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
plt.barh()
・barhは「bar horizontal(水平の棒)」の略
・plt.bar()と同じ引数ですが、棒が横向きになります
・ランキング表示に最適
plt.grid(axis=’x’)
・横向きの場合、X軸のグリッド線が見やすい
📝 棒ごとに色を変える
コード:棒ごとに異なる色
import matplotlib.pyplot as plt
subjects = ['国語', '数学', '英語', '理科', '社会']
scores = [85, 92, 78, 88, 95]
# 棒ごとに色を指定
colors = ['red', 'blue', 'green', 'orange', 'purple']
plt.figure(figsize=(10, 6))
plt.bar(subjects, scores, color=colors, edgecolor='black', alpha=0.7)
plt.title('科目別テスト結果', fontsize=16)
plt.xlabel('科目', fontsize=12)
plt.ylabel('得点', fontsize=12)
plt.ylim(0, 100)
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
colors = [‘red’, ‘blue’, ‘green’, ‘orange’, ‘purple’]
・色のリストを用意
・棒の数と同じ数の色を指定
color=colors
・リストで渡すと、各棒に順番に色が適用される
plt.ylim(0, 100)
・Y軸の範囲を0〜100に設定(テストの得点なので)
🔵 3. 散布図(Scatter Plot)
散布図は、2つの変数の関係を点で表現するグラフです。「勉強時間と成績の関係」「広告費と売上の関係」など、2つの数値の相関を見るときに使います。
🔰 基本的な散布図
コード:基本的な散布図
import matplotlib.pyplot as plt
# データの準備(身長と体重)
height = [160, 165, 170, 175, 180, 155, 162, 172, 178, 168]
weight = [55, 60, 65, 70, 75, 50, 58, 68, 72, 62]
# 散布図を描く
plt.scatter(height, weight)
plt.title('身長と体重の関係')
plt.xlabel('身長(cm)')
plt.ylabel('体重(kg)')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
plt.scatter(height, weight)
・plt.scatter():散布図を描く関数
・第1引数:X軸の値(身長)
・第2引数:Y軸の値(体重)
heightとweightの同じインデックスの値がペアになって、1つの点として表示されます。
実行結果
身長と体重の関係が点で表示されます。点が右上がりに並んでいれば「正の相関」(身長が高いほど体重も重い傾向)があります。
📝 点の色とサイズを変える
コード:点をカスタマイズ
import matplotlib.pyplot as plt
height = [160, 165, 170, 175, 180, 155, 162, 172, 178, 168]
weight = [55, 60, 65, 70, 75, 50, 58, 68, 72, 62]
# 色、サイズ、透明度を指定
plt.scatter(height, weight,
color='red', # 点の色
s=100, # 点のサイズ
alpha=0.6, # 透明度
edgecolors='black') # 点の枠線
plt.title('身長と体重の関係', fontsize=16)
plt.xlabel('身長(cm)', fontsize=12)
plt.ylabel('体重(kg)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
📌 plt.scatter()のパラメータ一覧
| パラメータ | 説明 | 例 |
| s | 点のサイズ | 50, 100, 200 |
| c または color | 点の色 | ‘red’, ‘blue’, リスト |
| alpha | 透明度 | 0.5, 0.7 |
| marker | 点の形 | ‘o’, ‘s’, ‘^’ |
| edgecolors | 点の枠線の色 | ‘black’, ‘gray’ |
📝 値によって色を変える(カラーマップ)
散布図では、3つ目の変数を色で表現できます。
コード:得点で色分けする散布図
import matplotlib.pyplot as plt
# データの準備
study_hours = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
test_scores = [50, 60, 65, 75, 85, 55, 70, 80, 90, 95]
plt.figure(figsize=(10, 6))
# 点の色を得点で変える
plt.scatter(study_hours, test_scores,
c=test_scores, # 得点で色分け
cmap='viridis', # カラーマップ
s=150,
alpha=0.7,
edgecolors='black')
# カラーバーを表示
plt.colorbar(label='テスト得点')
plt.title('勉強時間とテスト得点の関係', fontsize=16)
plt.xlabel('勉強時間(時間)', fontsize=12)
plt.ylabel('テスト得点', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
c=test_scores
・cパラメータに数値リストを渡すと、値に応じて色が変わる
・高い値は明るい色、低い値は暗い色になる
cmap=’viridis’
・カラーマップ(色の組み合わせ)を指定
・’viridis’は青→緑→黄色のグラデーション
plt.colorbar(label=’テスト得点’)
・色と値の対応を示すバーを表示
📈 4. ヒストグラム(Histogram)
ヒストグラムは、データの分布を見るためのグラフです。「テストの点数は何点台が多いか」「年齢層の分布はどうなっているか」など、データがどのように散らばっているかを確認するときに使います。
🔰 基本的なヒストグラム
コード:基本的なヒストグラム
import matplotlib.pyplot as plt
# データの準備(テストの点数)
scores = [55, 60, 65, 70, 75, 80, 85, 90, 95,
60, 65, 70, 75, 80, 85, 90,
50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
70, 75, 80, 85]
# ヒストグラムを描く
plt.hist(scores)
plt.title('テスト得点の分布')
plt.xlabel('得点')
plt.ylabel('人数')
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
plt.hist(scores)
・plt.hist():ヒストグラムを描く関数
・引数に1次元のデータリストを渡す
・自動的にデータを区間(ビン)に分けてカウント
ヒストグラムは棒グラフに似ていますが、連続したデータの分布を見るために使います。
実行結果
データがどの範囲に多く分布しているかがわかります。縦軸は「その区間に該当するデータの個数」です。
📝 区間の数(ビン数)を変更する
binsパラメータで、データをいくつの区間に分けるか指定できます。
コード:ビン数を指定
import matplotlib.pyplot as plt
scores = [55, 60, 65, 70, 75, 80, 85, 90, 95,
60, 65, 70, 75, 80, 85, 90,
50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
70, 75, 80, 85]
# bins=10で10個の区間に分ける
plt.hist(scores, bins=10, color='skyblue', edgecolor='black')
plt.title('テスト得点の分布', fontsize=16)
plt.xlabel('得点', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 binsの設定の目安
データ数が少ない場合(〜50件):5〜10
データ数が中程度(50〜200件):10〜20
データ数が多い場合(200件〜):20〜50
いくつか試して、分布がわかりやすいものを選びましょう。
📝 正規分布のデータを可視化
コード:正規分布のヒストグラム
import matplotlib.pyplot as plt
import numpy as np
# 正規分布に従うランダムデータを生成
data = np.random.normal(170, 10, 1000)
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, color='lightgreen', edgecolor='black', alpha=0.7)
plt.title('身長の分布(正規分布)', fontsize=16)
plt.xlabel('身長(cm)', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
np.random.normal(170, 10, 1000)
・正規分布に従うランダムな数値を生成
・第1引数:平均値(170cm)
・第2引数:標準偏差(10cm)
・第3引数:生成するデータの個数(1000個)
正規分布のデータは、ヒストグラムにすると釣鐘型になります。
📝 複数のヒストグラムを重ねる
コード:2つのデータを比較
import matplotlib.pyplot as plt
import numpy as np
# 男性と女性の身長データ
male_height = np.random.normal(172, 8, 500)
female_height = np.random.normal(160, 7, 500)
plt.figure(figsize=(10, 6))
# 2つのヒストグラムを重ねる
plt.hist(male_height, bins=20, alpha=0.5, label='男性', color='blue')
plt.hist(female_height, bins=20, alpha=0.5, label='女性', color='red')
plt.title('性別による身長分布の比較', fontsize=16)
plt.xlabel('身長(cm)', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.legend(fontsize=11)
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 重ねて表示するポイント
alpha=0.5
・透明度を0.5にすると、重なった部分が見える
・1.0だと後から描いたグラフが前を隠してしまう
label=’男性’
・凡例に表示する名前を指定
plt.legend()
・凡例を表示して、どちらが男性・女性かわかるようにする
🥧 5. 円グラフ(Pie Chart)
円グラフは、全体に対する割合を表現するグラフです。「売上の内訳」「支出の構成比」など、「全体を100%としたとき、各項目が何%か」を見せたいときに使います。
🔰 基本的な円グラフ
コード:基本的な円グラフ
import matplotlib.pyplot as plt
# データの準備
categories = ['食費', '住居費', '光熱費', '交通費', 'その他']
expenses = [30, 35, 10, 15, 10]
# 円グラフを描く
plt.pie(expenses, labels=categories)
plt.title('月々の支出内訳')
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
plt.pie(expenses, labels=categories)
・plt.pie():円グラフを描く関数
・第1引数:各項目の値(自動で合計に対する割合を計算)
・labels:各項目のラベル(名前)
📝 パーセンテージを表示する
コード:パーセンテージ付きの円グラフ
import matplotlib.pyplot as plt
categories = ['食費', '住居費', '光熱費', '交通費', 'その他']
expenses = [30, 35, 10, 15, 10]
# autopctでパーセンテージを表示
plt.pie(expenses, labels=categories, autopct='%1.1f%%')
plt.title('月々の支出内訳', fontsize=16)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 autopctの書式の意味
‘%1.1f%%’
・%1.1f:小数点以下1桁の数値
・%%:%記号を表示(%を2つ書くとエスケープ)
例:35.0%、10.0% のように表示されます。
📌 plt.pie()のパラメータ一覧
| パラメータ | 説明 | 例 |
| labels | 各項目のラベル | [‘A’, ‘B’, ‘C’] |
| autopct | パーセンテージの表示形式 | ‘%1.1f%%’ |
| startangle | 開始角度(0=右、90=上) | 90 |
| colors | 色のリスト | [‘red’, ‘blue’] |
| explode | 切り出し量のリスト | [0.1, 0, 0] |
| shadow | 影をつけるか | True |
📝 色と開始角度を指定する
コード:カスタマイズした円グラフ
import matplotlib.pyplot as plt
categories = ['食費', '住居費', '光熱費', '交通費', 'その他']
expenses = [30, 35, 10, 15, 10]
# 色を指定
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
plt.figure(figsize=(8, 8))
plt.pie(expenses,
labels=categories,
autopct='%1.1f%%',
colors=colors,
startangle=90)
plt.title('月々の支出内訳', fontsize=16)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
colors = [‘#ff9999’, …]
・16進数カラーコードでパステルカラーを指定
・項目数と同じ数の色を用意
startangle=90
・グラフの開始位置を上(12時の位置)に設定
・デフォルトは右(3時の位置)から開始
📝 特定の部分を強調する(切り出し)
コード:住居費を強調
import matplotlib.pyplot as plt
categories = ['食費', '住居費', '光熱費', '交通費', 'その他']
expenses = [30, 35, 10, 15, 10]
# explodeで切り出し量を指定(住居費を強調)
explode = [0, 0.1, 0, 0, 0]
plt.figure(figsize=(8, 8))
plt.pie(expenses,
labels=categories,
autopct='%1.1f%%',
explode=explode,
startangle=90,
shadow=True)
plt.title('月々の支出内訳', fontsize=16)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 コードの解説
explode = [0, 0.1, 0, 0, 0]
・各項目の「切り出し量」をリストで指定
・0:切り出しなし
・0.1:少し切り出す(中心から離す)
・2番目の「住居費」だけが0.1なので、住居費が強調される
shadow=True
・円グラフに影をつけて立体的に見せる
🔄 6. グラフの使い分け実践例
同じデータでも、見せたい内容によって適切なグラフは異なります。
📌 グラフ選択のポイント
| 見せたいこと | 最適なグラフ | 理由 |
| 時間による変化・推移 | 折れ線グラフ | 線でつながれて変化がわかる |
| カテゴリ間の比較 | 棒グラフ | 高さで大小を比較しやすい |
| 2変数の関係 | 散布図 | 相関関係が一目でわかる |
| データの分布 | ヒストグラム | どの範囲に多いかわかる |
| 割合・構成比 | 円グラフ | 全体に対する割合が直感的 |
📝 練習問題
問題1:棒グラフを作成(初級)
📋 問題
以下のデータを使って、色付きの棒グラフを作成してください。
fruits = ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
quantities = [25, 40, 30, 15]
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import matplotlib.pyplot as plt
fruits = ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
quantities = [25, 40, 30, 15]
plt.bar(fruits, quantities, color='orange', edgecolor='black')
plt.title('果物の販売数')
plt.xlabel('果物')
plt.ylabel('販売数')
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
問題2:散布図を作成(初級)
📋 問題
広告費と売上の関係を散布図で表現してください。点は大きめ(s=100)で、透明度をつけてください。
ad_cost = [10, 20, 30, 40, 50, 15, 25, 35, 45]
sales = [100, 150, 180, 220, 250, 120, 170, 200, 240]
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import matplotlib.pyplot as plt
ad_cost = [10, 20, 30, 40, 50, 15, 25, 35, 45]
sales = [100, 150, 180, 220, 250, 120, 170, 200, 240]
plt.scatter(ad_cost, sales, s=100, alpha=0.6, edgecolors='black')
plt.title('広告費と売上の関係')
plt.xlabel('広告費(万円)')
plt.ylabel('売上(万円)')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
問題3:ヒストグラムで分布を確認(中級)
📋 問題
正規分布のテスト得点データ(平均70、標準偏差15、200件)の分布をヒストグラム(bins=20)で表示してください。
解答例を見る
コード
import matplotlib.pyplot as plt
import numpy as np
scores = np.random.normal(70, 15, 200)
plt.figure(figsize=(10, 6))
plt.hist(scores, bins=20, color='lightblue', edgecolor='black')
plt.title('テスト得点の分布', fontsize=16)
plt.xlabel('得点', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
問題4:円グラフで構成比を表示(中級)
📋 問題
以下のデータを使って、パーセンテージ付きの円グラフを作成してください。最大の項目(A)を切り出して強調してください。
categories = ['A', 'B', 'C', 'D']
values = [40, 30, 20, 10]
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D']
values = [40, 30, 20, 10]
explode = [0.1, 0, 0, 0] # Aを強調
plt.figure(figsize=(8, 8))
plt.pie(values, labels=categories, autopct='%1.1f%%',
explode=explode, startangle=90, shadow=True)
plt.title('カテゴリ別構成比', fontsize=16)
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
問題5:横向き棒グラフでランキング(上級)
📋 問題
以下の都市の人口データを使って、横向きの棒グラフを作成してください。グリッド線も追加してください。
cities = ['東京', '横浜', '大阪', '名古屋', '札幌']
population = [1400, 375, 275, 232, 197]
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import matplotlib.pyplot as plt
cities = ['東京', '横浜', '大阪', '名古屋', '札幌']
population = [1400, 375, 275, 232, 197]
plt.figure(figsize=(10, 6))
plt.barh(cities, population, color='skyblue', edgecolor='black')
plt.title('都市別人口ランキング', fontsize=16)
plt.xlabel('人口(万人)', fontsize=12)
plt.ylabel('都市', fontsize=12)
plt.grid(axis='x', linestyle='--', alpha=0.3)
plt.tight_layout()
plt.show()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
🎯 このステップのまとめ
✅ 学んだこと
✓ plt.bar()で棒グラフ、plt.barh()で横向き棒グラフ
✓ plt.scatter()で散布図(2つの変数の関係)
✓ plt.hist()でヒストグラム(データの分布)
✓ plt.pie()で円グラフ(割合・構成比)
✓ データの特性に合わせてグラフを使い分ける
✓ 色、サイズ、透明度で見やすくする
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ 4種類のグラフをそれぞれ描ける
□ データに合わせてグラフを選べる
□ グラフの色やスタイルを変更できる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: 棒グラフと折れ線グラフの使い分けは?
A: 棒グラフはカテゴリ間の比較やランキングに適しています。折れ線グラフは時間の推移や連続的な変化を見るのに適しています。例えば「各店舗の売上比較」は棒グラフ、「月ごとの売上推移」は折れ線グラフが適切です。
Q2: 散布図で相関関係がわかりますか?
A: はい。点が右上がりに並んでいれば正の相関(一方が増えると他方も増える)、右下がりなら負の相関(一方が増えると他方は減る)、ばらばらなら相関なしと判断できます。
Q3: ヒストグラムのビン数はどう決めればいいですか?
A: データ数が少ない場合は5〜15、多い場合は20〜50程度が目安です。いくつか試して、分布の形がわかりやすいものを選びましょう。
Q4: 円グラフは何個までが見やすいですか?
A: 一般的には5〜7個までが見やすいです。それ以上になる場合は、小さい項目を「その他」にまとめることを検討しましょう。
Q5: グラフの種類を間違えるとどうなりますか?
A: データの特徴が伝わりにくくなります。例えば、時系列データを円グラフにすると推移がわからなくなります。「何を伝えたいか」を考えて、適切なグラフを選びましょう。
学習メモ
Pythonデータ分析入門 - Step 38