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

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

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

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

Python

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

Q&A

解決済

1回答

1989閲覧

matplotlibあるいはDataFrameにてヒストグラムを描く

okahijiki

総合スコア404

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2019/11/01 01:07

ヒストグラムの学習のため、ウェッブページからテーブルを読み込み、そのテーブルを元にヒストグラムを描こうとしています。がしかし、エラーになってしまいます。

python

1import pandas as pd 2url = ('https://bellcurve.jp/statistics/course/18769.html') 3df= pd.read_html(url) 4df=df[0] # ウェッブページの最初のテーブルを読み込む 5df

イメージ説明

python

1df=df[["階級(cm以上~cm未満)","度数"]] #任意の列を抽出する。 2df

イメージ説明

上記のデータフレームから、階級を横軸に、度数を縦軸にしたヒストグラムを描こうとしています。

【やったこと】

python

1import matplotlib.pyplot as plt 2plt.hist(df) 3TypeError: 5 is not a string # エラー表示 4 5df.hist() # 以下のようなグラフが表示されます。

イメージ説明

度数、階級値の値が横軸になり、縦軸の値はすべて1を示しているようです〜

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

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

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

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

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

t_obara

2019/11/01 01:29

df= pd.read_html(url) や、df=df[0] # ウェッブページの最初のテーブルを読み込む が、期待通りに動作しているように思えませんが、内容を確認したことはあるのでしょうか?
okahijiki

2019/11/01 01:49

コメント、ありがとうございます。 取り急ぎ、Typeを調べてみました。 ■データフレームのTypeは以下の通りとなります。 import pandas as pd url = ('https://bellcurve.jp/statistics/course/18769.html') df= pd.read_html(url) df=df[0] # ウェッブページの最初のテーブルを読み込む type(df) #Typeの確認 pandas.core.frame.DataFrame ■ 違う方法、クリップボードも試してみました。 (ウェブページの該当するテーブルをコピーし、そして) import pandas as pd df=pd.read_clipboard() type(df)#Typeの確認 pandas.core.frame.DataFrame よろしく、おねがいいたします。
t_obara

2019/11/01 03:23

すいません、勘違いでした。 今回のケースはすでに度数値がでているので、histではなく、単にbarで良いのでは?階級はラベルとして設定することで所望のグラフが得られそうです。
guest

回答1

0

ベストアンサー

取得したデータが既に度数分布表なのですから、そのまま棒グラフで表示するとよいのではないでしょうか。

Python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4url = ('https://bellcurve.jp/statistics/course/18769.html') 5df= pd.read_html(url)[0] 6 7df['度数'] = df['度数'].astype(int) 8df.plot(kind='bar', x='階級(cm以上~cm未満)', y='度数') 9plt.show()

イメージ説明

投稿2019/11/01 05:47

magichan

総合スコア15898

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

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

okahijiki

2019/11/01 07:12

あ、ウェッブサイトから抽出したフレームワークの「階級」は、26〜36までの連続した整数ではなかったんですね。「棒グラフで良いのでは」というご指摘、さらに以下の記述により、勘違いしている点が、よりクリアになりました。 from bs4 import BeautifulSoup from urllib import request url ='https://bellcurve.jp/statistics/course/18769.html' response = request.urlopen(url) soup = BeautifulSoup(response) tables = soup.find_all('table') print(tables[0]) <table> <tbody> <tr><th>階級(cm以上~cm未満)</th><th>階級値(cm)</th><th>度数</th><th>相対度数</th><th>累積相対度数</th></tr> <tr><td>26~28</td><td>27</td><td>5</td><td>5%</td><td>5%</td></tr> <tr><td>28~30</td><td>29</td><td>10</td><td>10%</td><td>15%</td></tr> <tr><td>30~32</td><td>31</td><td>30</td><td>30%</td><td>45%</td></tr> <tr><td>32~34</td><td>33</td><td>35</td><td>35%</td><td>80%</td></tr> <tr><td>34~36</td><td>35</td><td>20</td><td>20%</td><td>100%</td></tr> </tbody> </table> おっしゃる通り、このケースは棒グラフ、ですね。お手数をお掛けしました。ありがとうございましたー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問