質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

4008閲覧

Python : matplotlibのヒストグラムで"n未満" , "n以上" で描画する方法

Savanof

総合スコア33

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/19 12:51

前提・実現したいこと

PythonのMatplotlibでhist()を用いて度数分布 , ヒストグラムを作成したいと思っています。

Python

1import os 2import re 3import glob 4import numpy as np 5import pandas as pd 6import matplotlib.pyplot as plt 7import japanize_matplotlib 8 9Age_List = [23, 22, 23, 22, 24, 20, 22, 24, 1029, 28, 25, 25, 26, 27, 28, 27, 25, 25, 27, 25, 25, 1132, 32, 32, 33, 33, 32, 33, 32, 30, 33, 32, 1235, 39, 38, 38, 37, 35, 38, 35, 35, 38, 35, 37, 1343, 44, 40, 41, 44, 41, 40, 43, 44, 41, 41, 44, 43, 42, 40, 44, 42, 41, 42, 1447, 49, 49, 46, 48, 45, 49, 49, 49, 49, 49, 48, 46, 49, 45, 48, 49, 48, 1554, 52, 54, 53, 53, 54, 50, 51, 52, 54, 1658, 56, 58, 58, 55, 57, 56, 56, 55] 17 18fig = plt.figure(figsize=(5.5,3.5)) 19ax = fig.add_subplot(1,1,1) 20 21n, bins, _ = ax.hist(Age_List, bins=10, range=(30, 50),rwidth=0.8) 22 23 24xs = (bins[:-1] + bins[1:])/2 25ys = n.astype(int) 26 27for x, y in zip(xs, ys): 28 plt.text(x, y, str(y), horizontalalignment="center")

イメージ説明

ヒストグラムを作成するにあたり、Age_Listの値を基に30代未満 , 3032歳 , 3234歳...48~50歳,50以上
のような度数分布で描画したいです。

しかし、今の段階だと30歳未満 , 50歳以上の分布が表示されず除外されてしまいます。

Age_Listの値を基に集計を行えって、度数分布表を作成すれば恐らく作れるとは思うのですがmatplotlib上で簡単に作成する方法があれば教えて欲しいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こういうので、どうでしょう。

python

1import matplotlib.pyplot as plt 2 3Age_List = [23, 22, 23, 22, 24, 20, 22, 24, 429, 28, 25, 25, 26, 27, 28, 27, 25, 25, 27, 25, 25, 532, 32, 32, 33, 33, 32, 33, 32, 30, 33, 32, 635, 39, 38, 38, 37, 35, 38, 35, 35, 38, 35, 37, 743, 44, 40, 41, 44, 41, 40, 43, 44, 41, 41, 44, 43, 42, 40, 44, 42, 41, 42, 847, 49, 49, 46, 48, 45, 49, 49, 49, 49, 49, 48, 46, 49, 45, 48, 49, 48, 954, 52, 54, 53, 53, 54, 50, 51, 52, 54, 1058, 56, 58, 58, 55, 57, 56, 56, 55] 11 12Age_List_m = [28 if x < 30 else 52 if x > 50 else x for x in Age_List] 13 14fig = plt.figure(figsize=(5.5,3.5)) 15ax = fig.add_subplot(1,1,1) 16n, bins, _ = ax.hist(Age_List_m, bins=13, range=(27, 53),rwidth=0.8) 17xs = (bins[:-1] + bins[1:])/2 18ys = n.astype(int) 19for x, y in zip(xs, ys): 20 plt.text(x, y, str(y), horizontalalignment="center") 21 22plt.show()

実行結果
ヒストグラム

投稿2021/10/19 13:40

ppaul

総合スコア24672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Savanof

2021/10/19 14:27

ありがとうございます。 ワンライナーだと上手く解釈できなかったのですが、多分この様な事ですよね? for i in range(len(Age_List)): num = Age_List[i] if num < 30: Age_List[i] = 28 elif i > 50: Age_List[i] = 52 シンプルに書けて気に入ってます。ありがとうございます。
guest

0

以下のようにbinsを指定してみてはいかがでしょうか。
詳細はmatplotlib.pyplot.histを参照ください。

Python

1import matplotlib.pyplot as plt 2 3Age_List = [23, 22, 23, 22, 24, 20, 22, 24, 429, 28, 25, 25, 26, 27, 28, 27, 25, 25, 27, 25, 25, 532, 32, 32, 33, 33, 32, 33, 32, 30, 33, 32, 635, 39, 38, 38, 37, 35, 38, 35, 35, 38, 35, 37, 743, 44, 40, 41, 44, 41, 40, 43, 44, 41, 41, 44, 43, 42, 40, 44, 42, 41, 42, 847, 49, 49, 46, 48, 45, 49, 49, 49, 49, 49, 48, 46, 49, 45, 48, 49, 48, 954, 52, 54, 53, 53, 54, 50, 51, 52, 54, 1058, 56, 58, 58, 55, 57, 56, 56, 55] 11 12fig = plt.figure(figsize=(5.5,3.5)) 13ax = fig.add_subplot(1,1,1) 14 15bins = [0] + list(range(30,51,2)) + [max(Age_List) + 1] 16print(bins) # [0, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 59] 17n, bins, _ = ax.hist(Age_List, bins=bins, rwidth=0.8) 18 19 20xs = (bins[:-1] + bins[1:])/2 21ys = n.astype(int) 22 23for x, y in zip(xs, ys): 24 plt.text(x, y, str(y), horizontalalignment="center") 25 26plt.show()

イメージ説明

投稿2021/10/19 13:11

can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Savanof

2021/10/19 14:16

回答ありがとうございます。 公式ドキュメントを読んでみて、 >[1, 2, 3, 4] then the first bin is [1, 2) (including 1, but excluding 2) and the second [2, 3). The last bin, however, is [3, 4], which includes 4. この部分の記述を適用したのだと思うのですが、今回の bins = [0] + list(range(30,51,2)) + [max(Age_List) + 1] だと、[0] と [max(Age_List) + 1]が極端に棒の幅が大きくなってしまうのですが何か対処方法 or 参考になりそうなドキュメント等などありますでしょうか? よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問