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

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

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

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

Python

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

Q&A

解決済

2回答

1208閲覧

matplotlibを使って折れ線グラフを作成。

jury_new

総合スコア31

Matplotlib

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

Python

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

1グッド

0クリップ

投稿2020/05/27 13:03

編集2020/05/27 14:54

matplotlibを使って折れ線グラフを完成させる

日本の人口を年代別に折れ線グラフで表現したいと考えています。
西暦と人口についての情報はスクレイピング済で、グラフにする際にX,Y軸の目盛りにデータの内容が適用されないことや折れ線グラフ上に折れ線がなく白紙状態です。

〜〜〜〜〜やろうとしていること〜〜〜〜〜
0. X軸に西暦を含む情報 (関数yearより)
0. Y軸に人口の数(下記のデータの出力からわかります。8〜9桁の数字です)(関数nomal_dealより)

この二軸からなる折れ線グラフの作成をしようとしています。

python

1import requests 2import re 3import matplotlib.pyplot as plt 4import numpy as np 5from bs4 import BeautifulSoup 6url = 'https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E4%BA%BA%E5%8F%A3%E7%B5%B1%E8%A8%88' 7 8r = requests.get(url) 9html_soup = BeautifulSoup(r.text,'html.parser') 10 11base_locate = html_soup.find('table',class_='wikitable') 12 13def year(): 14 body = base_locate.find_next('tbody') 15 for year in body.find_all('th'): 16 text = year.get_text(strip=True) 17 make_list = [] 18 jp = re.sub('[年総人口前年比増減率]','',text) 19 make_list.append(jp) 20 print(make_list) 21 return make_list 22 23def nomal_deal(): 24 for num in base_locate.find_all('tr'): 25 for deal in num.find_all('td'): 26 text = deal.get_text(strip=True) 27 sea = re.sub('[^0-9]','',text) 28 bre = re.sub(',','',sea) 29 core = re.findall('^[0-9]{8,}',bre) 30 core_int = [int(s) for s in core] 31 print(core_int) 32 return core_int 33 34year() 35nomal_deal() 36 37year = year() 38nomal = nomal_deal() 39 40 41left = np.array(year) 42height = np.array(nomal) 43 44fig,ax = plt.subplots() 45plt.plot(left,height) 46 47ax.set(xlabel = 'year',ylabel ='deal', 48 title='number of birth') 49ax.grid() 50 51fig.savefig("number_of_birth.png") 52plt.show() 53 54

試したこと

調べた結果、リストやタプルなどを引数にとって出力するが可能??となっていました。
re.findallはパターンに重複しない形でリストの形式で返すため最初はうまくいくと考えたのですが、
折れ線グラフ上やX,Y軸の目盛りに西暦や人口数などのデータが反映されません。

自分なりに考えたこととしては、リストが現時点でバラバラの状態のために上手く反映されない?
(つまり、一つのリストにデータの一覧が格納されているのではなく、一つ一つ取得データをリストとしていることが問題?)
と考え。。。一つのリストにデータを全て格納しまとめれば良いのではないかと考えました。そしてappendを使ってリストを格納しようとしたのですが、そのためには新規のリストを作成する必要がありこれでは手の打ちようがないと。。勝手に思ってます。

上記の__リストが今回表を作成する際のネックになっている__という考察は自分の推察であり、これが今回の問題の根底にあるものだとは言い切れません。。

*以下は折れ線グラフの引数にとっているデータの内容です。二回出力された状態でそれぞれデータの内容は変わりません。

[''] [''] [''] ['1910(明治43)'] ['1915(大正4)'] ['1920(大正9)'] ['1925(大正14)'] ['1930(昭和5)'] ['1935(昭和10)'] ['1940(昭和15)'] ['1945(昭和20)'] ['1950(昭和25)'] ['1955(昭和30)'] ['1960(昭和35)'] ['1965(昭和40)'] ['1970(昭和45)'] ['1975(昭和50)'] ['1980(昭和55)'] ['1985(昭和60)'] ['1990(平成2)'] ['1995(平成7)'] ['2000(平成12)'] ['2005(平成17)'] ['2010(平成22)'] ['2015(平成27)'] ['2016'] ['2017'] ['2018'] [50984840] [] [54935755] [] [55963053] [] [59736822] [] [64450005] [] [69254148] [] [73075071] [] [71998104] [] [83199637] [] [89275529] [] [93418501] [] [98274961] [] [103720060] [] [111939643] [] [117060396] [] [121048923] [] [123611167] [] [125570246] [] [126925843] [] [127767994] [] [128057352] [] [127094745] [] [126932772] [] [126706210] [] [126443180] [] [''] [''] [''] ['1910(明治43)'] ['1915(大正4)'] ['1920(大正9)'] ['1925(大正14)'] ['1930(昭和5)'] ['1935(昭和10)'] ['1940(昭和15)'] ['1945(昭和20)'] ['1950(昭和25)'] ['1955(昭和30)'] ['1960(昭和35)'] ['1965(昭和40)'] ['1970(昭和45)'] ['1975(昭和50)'] ['1980(昭和55)'] ['1985(昭和60)'] ['1990(平成2)'] ['1995(平成7)'] ['2000(平成12)'] ['2005(平成17)'] ['2010(平成22)'] ['2015(平成27)'] ['2016'] ['2017'] ['2018'] [50984840] [] [54935755] [] [55963053] [] [59736822] [] [64450005] [] [69254148] [] [73075071] [] [71998104] [] [83199637] [] [89275529] [] [93418501] [] [98274961] [] [103720060] [] [111939643] [] [117060396] [] [121048923] [] [123611167] [] [125570246] [] [126925843] [] [127767994] [] [128057352] [] [127094745] [] [126932772] [] [126706210] [] [126443180] []
Kmakiri4568👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

pandasを習得すればもっと簡単に実現できるので、機会があったら調べてみてください。

python

1import matplotlib.pyplot as plt 2import pandas as pd 3 4url = 'https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E4%BA%BA%E5%8F%A3%E7%B5%B1%E8%A8%88' 5df=pd.read_html(url)[2].set_index('年') 6fig,ax = plt.subplots() 7df["総人口"].plot(ax=ax)

これだけで折れ線グラフ作成まで出来ます。

投稿2020/05/27 14:49

x98000

総合スコア1096

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

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

jury_new

2020/05/27 15:08

x98000さん、ありがとうございます! やはり、pandasなどを使うことが一般的でmatplotlibは折れ線グラフなどを作成することはナンセンスでしょうか?自分は最近データをビジュアル化するためのライブラリを勉強し始めたのですが、matplotlibは複雑で使いにくいのでpandasやseabornなどを使った方がいい。みたいなサイトをよく見かけます。 参考までにデータをビジュアル化するライブラリの中でのmatplotlibを積極的に使うべきかどうかについて もしよろしければ、ご教示いただけないでしょうか? 長文かつ何度もしつこく申し訳ありません。
x98000

2020/05/27 15:18

いえ、この例もmatplotlib使ってますよ。データ収集とシリーズ化はpandasの機能ですが、df.plotは内部ではmatplotlibを呼んでいるので、gridやlegendなど細かい設定はmatplotlibの知識が必要です。seabornもmatplotlibが基盤になっているので同様です。 過去の資産も多くあるので、当面はmatplotlibを積極的に使っていって問題ないと思います。
jury_new

2020/05/27 15:29

ありがとうございます!あ、、使ってましたね笑すみません確認不足で、、、 そうなんですね、pandas勉強しようと思います。 pandasの例についてなんですが、エラーが出てしまいました。 urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)> これは、自分のpythonのバージョンに依存する??ものだと調べたらわかりました。 解決策について自分でなんとかしようと思っています!ただ、x98000さんはエラーは出なかったでしょうか?もしよろしければ参考までに教えていただけないでしょうか?無視していただいても全然問題ありません。 この度はpandasのアドバイスありがとうございました。
x98000

2020/05/27 15:47

そうですね。こちらでは(python:3.7.2, pandas:1.0.3, urllib3:1.25.8)エラー無く動作確認出来ています。
guest

0

基本的なところで幾つか問題がありそうです。まず、

python

1visu = print(jp)

は意味がないです。print()は標準出力(画面)に表示するだけで戻り値がありませんのでvisuは常にNoneです。よって、関数year()nomal_deal()も何も結果を返していません。
また、結果はリストなどの集合で返す必要がありますので、関数の中でリストを組み立ててreturnで返す必要があります。

もう少し見直してコードを再提示してはどうでしょうか。

投稿2020/05/27 14:20

x98000

総合スコア1096

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

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

jury_new

2020/05/27 14:28

x98000さん、ご回答ありがとうございます! そうだったんですね、、、、、 見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問