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

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

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

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

Q&A

解決済

1回答

3852閲覧

python グラフの軸・範囲設定

DobashiT

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/07/07 08:55

編集2020/07/07 08:57

出力される図

グラフで範囲指定が上手くできません。
(1)軸設定
まず、軸の最大値及び目盛が表示されないです。
例えば、図の下横軸を0から100までに設定しているのですが、"100"の数字とその目盛が描かれません。
(2)範囲指定
右縦軸の最小値を0にし、それ以下はグラフ内に表示したくないのですが、
エラーバーを設定したせいなのか上手くいきません(エラーバーの範囲が0を下回る点があるから?)。

どのように修正すればよいかご助言いただけると幸いです。

また、説明が不足している点があれば、ご指摘頂けると幸いです。
以下にコードとデータを記します。

Excel

python

1import matplotlib as mpl 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5import datetime 6import matplotlib.dates as mdates 7import openpyxl 8 9wb = openpyxl.load_workbook("RenSS.xlsx") 10ws = wb["Sheet1"] 11 12header_cells = ws[1] 13 14student_list = [] 15for row in ws.iter_rows(min_row=3): 16 row_dic = {} 17 for k, v in zip(header_cells, row): 18 row_dic[k.value] = v.value 19 student_list.append(row_dic) 20 21f = [] 22for student in student_list: 23 f.append(student["F"]) 24 25start = [] 26for student in student_list: 27 start.append(student["Start run"]) 28 29stop = [] 30for student in student_list: 31 stop.append(student["Stop run"]) 32 33rn = [] 34for student in student_list: 35 rn.append(student["Run"]) 36 37wd = [] 38for student in student_list: 39 wd.append(student["Wind"]) 40 41err = [] 42for student in student_list: 43 err.append(student["ERROR"]) 44 45#グラフ内のnonを削除 46rnZ = filter(None, rn) 47wdZ = filter(None, wd) 48errZ = filter(None, err) 49 50plt.rcParams['xtick.major.width'] = 1.3#x軸主目盛り線の線幅 51plt.rcParams['ytick.major.width'] = 1.3#y軸主目盛り線の線幅 52plt.rcParams['axes.linewidth'] = 1.3# 軸の線幅edge linewidth。囲みの太さ 53 54fig = plt.figure(figsize=(6.5,2.2),dpi=150)#図の大きさ、解像度 55ax1 = fig.add_subplot(1,1,1) 56ax1.yaxis.set_ticks_position('both')#y軸目盛両側 57ax1.xaxis.set_ticks_position('both')#x軸目盛両側 58for A, B, C in zip(start, stop, f): 59 if C == "non": 60 continue 61 if A is None: 62 continue 63 x = np.arange(A, B, 0.1) 64 y = np.arange(-10, 10, 0.1) 65 y = x + C - x 66 ax1.plot(x, y, color="black", linewidth=5) 67 68plt.xticks(np.arange(0, 100,10)) 69plt.ylim([0, 90]) 70plt.xlim([0, 100]) 71 72 73x2 = list(rnZ) 74y2 = list(wdZ) 75 76ax2 = ax1.twinx() 77ax2.scatter(x2, y2,marker="o",s=8, color = "green") 78plt.errorbar(x2, y2, yerr = list(errZ), capsize=5, fmt='o', markersize=8, ecolor='green', markeredgecolor = "green", color='green') 79 80ax2.set_yticks([0,5,10,15,20,25])#y2のプロット位置(強引) 81ax2.set_yticklabels([0,5,10,15,20,25])#何を表示するか(強引) 82 83plt.show()

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

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

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

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

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

guest

回答1

0

ベストアンサー

(1)軸設定
まず、軸の最大値及び目盛が表示されないです。
例えば、図の下横軸を0から100までに設定しているのですが、"100"の数字とその目盛が描かれません。

numpy.arange(start, end) は Python の range() 同様、end は含みません。
なので、ax1.set_xticks(np.arange(0, 100, 10))ax1.set_xticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) と同じで100は含まれていません。

以下のように修正してください

diff

1- ax1.set_xticks(np.arange(0, 100, 10)) 2+ ax1.set_xticks(np.arange(0, 101, 10))

(2)範囲指定
右縦軸の最小値を0にし、それ以下はグラフ内に表示したくないのですが、
エラーバーを設定したせいなのか上手くいきません(エラーバーの範囲が0を下回る点があるから?)。

ax2 = ax1.twinx() は x 軸は共有されますが、y 軸は左と右で独立したものになります。
なので、plt.ylim([0, 90]) で左の y 軸の範囲を [0, 90] にするという設定は右には反映されていません。
個別に ax2.set_ylim([0, 25]) で y 軸の範囲を設定してください。

修正後のコード

python

1import matplotlib as mpl 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5import datetime 6import matplotlib.dates as mdates 7import openpyxl 8 9wb = openpyxl.load_workbook("RenSS.xlsx") 10ws = wb["Sheet1"] 11 12header_cells = ws[1] 13 14student_list = [] 15for row in ws.iter_rows(min_row=3): 16 row_dic = {} 17 for k, v in zip(header_cells, row): 18 row_dic[k.value] = v.value 19 student_list.append(row_dic) 20 21f = [] 22for student in student_list: 23 f.append(student["F"]) 24 25start = [] 26for student in student_list: 27 start.append(student["Start run"]) 28 29stop = [] 30for student in student_list: 31 stop.append(student["Stop run"]) 32 33rn = [] 34for student in student_list: 35 rn.append(student["Run"]) 36 37wd = [] 38for student in student_list: 39 wd.append(student["Wind"]) 40 41err = [] 42for student in student_list: 43 err.append(student["ERROR"]) 44 45# グラフ内のnonを削除 46rnZ = filter(None, rn) 47wdZ = filter(None, wd) 48errZ = filter(None, err) 49 50plt.rcParams["xtick.major.width"] = 1.3 # x軸主目盛り線の線幅 51plt.rcParams["ytick.major.width"] = 1.3 # y軸主目盛り線の線幅 52plt.rcParams["axes.linewidth"] = 1.3 # 軸の線幅edge linewidth。囲みの太さ 53 54fig = plt.figure(figsize=(6.5, 2.2), dpi=150) # 図の大きさ、解像度 55ax1 = fig.add_subplot(1, 1, 1) 56ax1.yaxis.set_ticks_position("both") # y軸目盛両側 57ax1.xaxis.set_ticks_position("both") # x軸目盛両側 58for A, B, C in zip(start, stop, f): 59 if C == "non": 60 continue 61 if A is None: 62 continue 63 x = np.arange(A, B, 0.1) 64 y = np.arange(-10, 10, 0.1) 65 y = x + C - x 66 ax1.plot(x, y, color="black", linewidth=5) 67 68ax1.set_xticks(np.arange(0, 101, 10)) 69ax1.set_ylim([0, 90]) 70ax1.set_xlim([0, 100]) 71 72 73x2 = list(rnZ) 74y2 = list(wdZ) 75 76ax2 = ax1.twinx() 77ax2.scatter(x2, y2, marker="o", s=8, color="green") 78plt.errorbar( 79 x2, 80 y2, 81 yerr=list(errZ), 82 capsize=5, 83 fmt="o", 84 markersize=8, 85 ecolor="green", 86 markeredgecolor="green", 87 color="green", 88) 89ax2.set_ylim([0, 25]) 90 91ax2.set_yticks([0, 5, 10, 15, 20, 25]) # y2のプロット位置(強引) 92ax2.set_yticklabels([0, 5, 10, 15, 20, 25]) # 何を表示するか(強引) 93 94plt.show()

イメージ説明

投稿2020/07/07 09:29

編集2020/07/07 09:36
tiitoi

総合スコア21956

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

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

DobashiT

2020/07/07 09:45

tiitoi様 早速ご回答いただき、有り難うございました。 自分が分からなかったことがすべてわかりました。 自分ではなかなか解決できなかったので、感動しました。 指摘頂いた点(arangeがendを含まないことなど)は参考書でよく勉強しようと思います。 本当に有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問