Python matplotlibでグラフを作る-4（選挙の投票率）

選挙の投票を促すために、ツイッターで投票率を示すために作成しました。

時間がたつに連れて、刻々と変わる投票率のためにプログラムを変更するのは、問題があるのでデータをファイルから読み込むように変更しました。スキルが低いので色々と悩みましたが、とりあえずできました。

csvファイルは、一度作成すれば変更する必要が無い前回の投票率用と、刻々と変わる当日用のファイルに分けました。
前回の投票率用には、変更がない当日用のデータも入れています。

前回投票率.csv

```shell-session
投票率
2018
XX県知事選挙
2018年XX月XX日
1934077
344704
2016
13.28
0
5.5
11
15.3
20.1
25
31
32
33
40
45
50
60
```

投票率.csv

```shell-session
投票数
0
82000
189000
293000
417000
496000
513000
660000
732000
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/e02f5c26-fd63-7af3-4a63-f9f1e81f0b00.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/85989fc1-eedc-18cc-9236-27744da61958.png)


元になるコードは、わかりやすく・改造もしやすい、コメント欄で教えて頂いたものを元に変更しました。ありがとうございます。

```python:
#!/usr/bin/python3
# coding: UTF-8

import matplotlib.pyplot as plt
import csv

filename_before = '前回投票率.csv'
filename = '投票率.csv'

#前回のデータと今回の期日前投票の票数等
votes_before = []

with open(filename_before) as f_before:
    reader_before = csv.reader(f_before)

    next(reader_before)

    for row_before in reader_before:
        #votes_before.append(float(row_before[0]))
        votes_before.append(row_before[0])

#今回の投票数
votes = []

with open(filename) as f:
    reader = csv.reader(f)

    next(reader)

    for row in reader:
        votes.append(float(row[0]))  #何時の投票数

start_hour = 8
end_hour = 20
end_hour1 = len(votes) + 7
vote_hours = range(start_hour, end_hour + 1)
vote_hours1 = range(start_hour, end_hour1 + 1)  #当日用
hour_range = [start_hour, end_hour]
rate_range = [0, 100]
hour_tics = range(start_hour, end_hour + 1)
rate_tics = range(0, 100 + 5, 5)

# 前回選挙  Last Election
l_e_label = votes_before[5]  # 凡例（日本語を指定するとエラー）
l_e_n_v_t = float(votes_before[6])  # (%) 前回の期日前投票率
l_e_votes = [
    float(votes_before[7]),      #  8時の投票率
    float(votes_before[8]),      #  9時の投票率
    float(votes_before[9]),      # 10時の投票率
    float(votes_before[10]),      # 11時の投票率
    float(votes_before[11]),     # 12時の投票率
    float(votes_before[12]),     # 13時の投票率
    float(votes_before[13]),     # 14時の投票率
    float(votes_before[14]),     # 15時の投票率
    float(votes_before[15]),     # 16時の投票率
    float(votes_before[16]),     # 17時の投票率
    float(votes_before[17]),     # 18時の投票率
    float(votes_before[18]),     # 19時の投票率
    float(votes_before[19]),  # 最終投票率
]

# 今回選挙
t_t_label = votes_before[0]  # 凡例（日本語を指定するとエラー）
election_name = votes_before[1]  # 選挙名称
election_date = votes_before[2]  # 選挙日付
number_of_voters = float(votes_before[3])  # この選挙時における選挙人名簿登録者数
number_of_votes_before_due_date = float(votes_before[4])  # 期日前投票数

# 各時間の投票率

voter_turnout = [vote / number_of_voters * 100 for vote in votes]

# novbdd_voter_turnout 期日前投票率
n_v_t = number_of_votes_before_due_date / number_of_voters * 100

# print(n_v_t)

font = {'family': 'IPAGothic'}  # 日本語Fontを指定

plt.xlim(hour_range)
plt.ylim(rate_range)

plt.xlabel('（時）', **font)
plt.ylabel('投票率(%)', **font)

plt.xticks(hour_tics)
plt.yticks(rate_tics)
plt.grid(color='gray', linestyle='--')

# 当日合計投票率
plt.plot(vote_hours1, [v + n_v_t for v in voter_turnout],
         linewidth=5, color='red', label=t_t_label)
# 前回の合計投票率
plt.plot(vote_hours, [v + l_e_n_v_t for v in l_e_votes],
         linestyle='--', linewidth=5, color='gray', label=l_e_label)
# 当日投票率
plt.plot(vote_hours1, voter_turnout,
         color='red', label=t_t_label)
# 前回の当日投票率
plt.plot(vote_hours, l_e_votes,
         linestyle='--', color='gray', label=l_e_label)
# 期日前投票率
plt.plot(hour_range, [n_v_t, n_v_t],
         color='red', label=t_t_label)
# 前回の期日前投票率
plt.plot(hour_range, [l_e_n_v_t, l_e_n_v_t],
         linestyle='--', color='gray', label=l_e_label)
# グラフの凡例
plt.legend(loc='upper left')
plt.title('{}  {}  投票率'.format(election_date, election_name), **font)
# 凡例でfontを指定するとエラーになるためtextで表示
plt.text(10.5, 90, '合計投票率', color="black", fontsize=20, **font)
plt.text(10.5, 78, '当日投票率', color="black", fontsize=20, **font)
plt.text(10.5, 66, '期日前投票率', color="black", fontsize=20, **font)

# plt.savefig('投票率.png')  #pngで保存
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/4f15c714-e16a-23a9-ec23-76e5dcdcf92f.png)

古いコード

```python:
#!/usr/bin/python3
# coding: UTF-8

import matplotlib.pyplot as plt
import numpy as np

#入力範囲ここから---------------------------

#前回選挙　Last Election
l_e_label = "2016" #凡例（日本語を指定するとエラー）
l_e_n_v_t = 13.28  #(%) 前回の期日前投票率
l_e_votes_8 = 0  #8時の投票率
l_e_votes_9 = 2  #9時の投票率
l_e_votes_10 = 3  #10時の投票率
l_e_votes_11 = 5  #11時の投票率
l_e_votes_12 = 10  #12時の投票率
l_e_votes_13 = 15  #13時の投票率
l_e_votes_14 = 20  #14時の投票率
l_e_votes_15 = 25  #15時の投票率
l_e_votes_16 = 30  #16時の投票率
l_e_votes_17 = 35  #17時の投票率
l_e_votes_18 = 40  #18時の投票率
l_e_votes_19 = 45  #19時の投票率
l_e_votes_20 = 51.34  #最終投票率

#今回選挙
t_t_label = "2018" #凡例（日本語を指定するとエラー）
election_name = "XX県知事選挙"  #選挙名称
election_date = "2018年XX月XX日"  #選挙日付
number_of_voters = 1934077  #この選挙時における選挙人名簿登録者数
number_of_votes_before_due_date = 344704 #期日前投票数
votes_8 = 0  #8時現在の投票数（全数）
votes_9 = 100000  #9時現在の投票数（全数）
votes_10 = 200000  #10時現在の投票数（全数）
votes_11 = 300000  #11時現在の投票数（全数）
votes_12 = 450000  #12時現在の投票数（全数）
votes_13 = 500000  #13時現在の投票数（全数）
votes_14 = 550000  #14時現在の投票数（全数）
votes_15 = 650000  #15時現在の投票数（全数）
votes_16 = 750000  #16時現在の投票数（全数）
votes_17 = 850000  #17時現在の投票数（全数）
votes_18 = 900000  #18時現在の投票数（全数）
votes_19 = 930000  #19時現在の投票数（全数）
votes_20 = 950000  #本日の投票総数（全数）

#入力範囲ここまで--------------------------------------------

voter_turnout_8 = votes_8 / number_of_voters * 100  #各時間の投票率
voter_turnout_9 = votes_9 / number_of_voters * 100
voter_turnout_10 = votes_10 / number_of_voters * 100
voter_turnout_11 = votes_11 / number_of_voters * 100
voter_turnout_12 = votes_12 / number_of_voters * 100
voter_turnout_13 = votes_13 / number_of_voters * 100
voter_turnout_14 = votes_14 / number_of_voters * 100
voter_turnout_15 = votes_15 / number_of_voters * 100
voter_turnout_16 = votes_16 / number_of_voters * 100
voter_turnout_17 = votes_17 / number_of_voters * 100
voter_turnout_18 = votes_18 / number_of_voters * 100
voter_turnout_19 = votes_19 / number_of_voters * 100
voter_turnout_20 = votes_20 / number_of_voters * 100

n_v_t = number_of_votes_before_due_date / number_of_voters * 100 #novbdd_voter_turnout 期日前投票率

#print(n_v_t)

font = {'family':'IPAGothic'} #日本語Fontを指定

plt.xlim([8,20])
plt.ylim([0,100])

plt.xlabel('（時）', **font)
plt.ylabel('投票率(%)', **font)

plt.xticks(np.arange(8,20+1,1))
plt.yticks(np.arange(0,100+5,5))
plt.grid(color='gray',linestyle='--')

plt.plot([8,9,10,11,12,13,14,15,16,17,18,19,20],[voter_turnout_8+n_v_t,voter_turnout_9+n_v_t,voter_turnout_10+n_v_t,voter_turnout_11+n_v_t,voter_turnout_12+n_v_t,voter_turnout_13+n_v_t,voter_turnout_14+n_v_t,voter_turnout_15+n_v_t,voter_turnout_16+n_v_t,voter_turnout_17+n_v_t,voter_turnout_18+n_v_t,voter_turnout_19+n_v_t,voter_turnout_20+n_v_t],linewidth=5,color='red', label="2018")  #当日合計投票率

plt.plot([8,9,10,11,12,13,14,15,16,17,18,19,20],[l_e_votes_8+l_e_n_v_t,l_e_votes_9+l_e_n_v_t,l_e_votes_10+l_e_n_v_t,l_e_votes_11+l_e_n_v_t,l_e_votes_12+l_e_n_v_t,l_e_votes_13+l_e_n_v_t,l_e_votes_14+l_e_n_v_t,l_e_votes_15+l_e_n_v_t,l_e_votes_16+l_e_n_v_t,l_e_votes_17+l_e_n_v_t,l_e_votes_18+l_e_n_v_t,l_e_votes_19+l_e_n_v_t,l_e_votes_20+l_e_n_v_t],linestyle='--',linewidth=5,color='gray', label=l_e_label)  #前回の合計投票率

plt.plot([8,9,10,11,12,13,14,15,16,17,18,19,20],[voter_turnout_8,voter_turnout_9,voter_turnout_10,voter_turnout_11,voter_turnout_12,voter_turnout_13,voter_turnout_14,voter_turnout_15,voter_turnout_16,voter_turnout_17,voter_turnout_18,voter_turnout_19,voter_turnout_20],color='red', label="2018")  #当日投票率

plt.plot([8,9,10,11,12,13,14,15,16,17,18,19,20],[l_e_votes_8,l_e_votes_9,l_e_votes_10,l_e_votes_11,l_e_votes_12,l_e_votes_13,l_e_votes_14,l_e_votes_15,l_e_votes_16,l_e_votes_17,l_e_votes_18,l_e_votes_19,l_e_votes_20],linestyle='--',color='gray', label=l_e_label)  #前回の当日投票率


plt.plot([8,20],[n_v_t,n_v_t],color='red', label=t_t_label)  #期日前投票率

plt.plot([8,20],[l_e_n_v_t,l_e_n_v_t],linestyle='--',color='gray', label=l_e_label)  #前回の期日前投票率

plt.legend(loc='upper left')  #グラフの凡例の表示位置
plt.title('{}　{}　投票率'.format(election_date,election_name), **font)

#凡例でfontを指定するとエラーになるためtextで表示
plt.text(10.5, 90, '合計投票率', color="black", fontsize=20, **font) 
plt.text(10.5, 78, '当日投票率', color="black", fontsize=20, **font)
plt.text(10.5, 66, '期日前投票率', color="black", fontsize=20, **font)

#plt.savefig('投票率.png')  #pngで保存
plt.show()
```

![投票率.png](https://qiita-image-store.s3.amazonaws.com/0/238800/4e6b5d56-2c96-0ad7-c296-77a675ced6a3.png)