MVMt17
@MVMt17

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Python3】Plotlyを使った折れ線グラフ作成でy軸が1つしか指定されず折れ線になりません。

解決したいこと

Python3で株価データを1年分取得、Plotlyで取得したデータから折れ線グラフを作成しようとしています。
折れ線グラフはhtmlファイルに出力されるよう設計。
コード実行後、Webサイトでファイル確認してるのですが添付画像のようになります。
スクリーンショット 2025-01-12 18.34.25.png

発生している問題・エラー

エラーは起きず、htmlで出力まで問題なし。
生成後のグラフに課題あり。
┗y軸が問題なのか、取得した株価データがグラフ作成のコードと噛み合っていないのか、原因がわかりません。

該当するソースコード(どこが問題かわからないため全て記載)

import yfinance as yf
import plotly.graph_objects as go

# 株価データの取得(日立、1年分)
ticker = "6501.T"
data = yf.download(ticker, period="1y")

# 小数点を省いてデータを整数化
data = data.round(0).astype(int)

# 日付をリセットしてデータを整える
data.reset_index(inplace=True)

# 日付ラベルを10個ごとに取得
date_labels = data['Date'][::10].tolist() 

# Plotlyでインタラクティブな折れ線グラフを作成
fig = go.Figure()

# 株価の折れ線グラフを追加
fig.add_trace(go.Scatter(
    x=data['Date'],  # X軸に日時
    y=data['Close'],  # Y軸に株価(整数化済み)
    mode='lines+markers',  # 折れ線+マーカー
    name='Close Price',
    marker=dict(size=5, color='blue'),
    line=dict(color='blue', width=2)
))

# グラフのレイアウトを設定
fig.update_layout(
    title=f'{ticker} Stock Prices (1 year)',
    xaxis_title='Date',
    yaxis_title='Close Price (JPY)',
    xaxis=dict(
        showgrid=True,
        tickangle=45,  # 日付ラベルを45度回転
        type='date',  # X軸を日時型として表示
        tickformat='%Y-%m-%d'  # 日付フォーマットを「年-月-日」に設定
    ),
    yaxis=dict(
        showgrid=True,
        range=[0, 5000],  # Y軸を0〜5000に固定
        dtick=1000  # 1000区切りで目盛りを表示
    ),
    template='plotly_white',
    height=600,
    width=1000
)

# HTMLファイルにグラフを保存
output_file = "/users/s12585/desktop/yfinance_test/interactive_chart_no_decimal2.html"
fig.write_html(output_file)

print(f"折れ線グラフがHTMLファイルに出力されました: {output_file}")

自分で試したこと

y軸の数字を株価に合わせて指定

range=[0, 5000],  # Y軸を0〜5000に固定
dtick=1000  # 1000区切りで目盛りを表示

取得した株価データの不要そうな行の削除

data = data.iloc[2:].reset_index(drop=True)  # 最初の2行を削除してインデックスをリセット

日付ラベルを指定した数ごとに取得

# 日付ラベルを10個ごとに取得
date_labels = data['Date'][::10].tolist() 

これら試しましたがグラフは治りませんでした。
まだ知見も浅いため、お力添えお願いいたします。

0

2Answer

データがグラフで表せない理由なのですが、
取得してきたデータについてdata['Close']といったところに株価(終値)がないためだとおもいます。

以下のように、デバッグしてみたところ

data = yf.download(ticker, period="1y")

print("[DEBUG] ダウンロード直後のデータ shape:", data.shape)
print("[DEBUG] ダウンロード直後のデータ head:\n", data.head())

これをデバッグ実行すると


[DEBUG] ダウンロード直後のデータ shape: (247, 5)
[DEBUG] ダウンロード直後のデータ head:
 Price             Close         High          Low         Open    Volume
Ticker           6501.T       6501.T       6501.T       6501.T    6501.T
Date                                                                    
2024-01-10  2093.781006  2111.558392  2068.102560  2087.855211  12080500
2024-01-11  2181.680420  2198.470174  2159.952503  2172.791726  19176500
2024-01-12  2172.791504  2191.556521  2159.952281  2190.568889  13199000
2024-01-15  2227.111572  2230.074470  2193.532063  2193.532063   2692500
2024-01-16  2193.531982  2235.012551  2190.569085  2193.531982  14023500

のようになりました。
おそらく想定ではグラフに扱うデータはdata['Close']にある前提ですが、
間にTickerが入っていて取得できません。つまりIndexが

>>> df.columns
MultiIndex([('Close',      '6501.T'),
            ('High',       '6501.T'),
            ('Low',        '6501.T'),
            ('Open',       '6501.T'),
            ('Adj Close',  '6501.T'),
            ('Volume',     '6501.T')],
           )

ようになっています。このように列名が「( 'Close', '6501.T' )」のようなタプルで構成されています。
第1階層:"Close", "High", "Low", "Open", "Adj Close", "Volume"
第2階層:"6501.T"
このままだと df["Close"] と書いても取得できず、df[('Close','6501.T')] のようにして指定する必要があるなど、扱いが面倒です。
であるのでフラットな”列名に変更することも考えられます。

カラム名をデバッグしつつdata['Close']で取得可能なように変更するか、取得すためのカラム名を正確に把握して取得するか?がグラフを表示する解決方法になるかと思います。

0Like

Comments

  1. @MVMt17

    Questioner

    ありがとうございます。とても参考になりました。
    ひとまず両方やってみて正しくグラフ表示されるか試してみたいと思います。

この様に修正したらグラフが表示されました。

【修正前】

# Plotlyでインタラクティブな折れ線グラフを作成
fig = go.Figure()

# 株価の折れ線グラフを追加
fig.add_trace(go.Scatter(
    x=data['Date'],  # X軸に日時
    y=data['Close'],  # Y軸に株価(整数化済み)
    mode='lines+markers',  # 折れ線+マーカー
    name='Close Price',
    marker=dict(size=5, color='blue'),
    line=dict(color='blue', width=2)
))

【修正後】

# Plotlyでインタラクティブな折れ線グラフを作成
fig = go.Figure(go.Scatter(
    x=data['Date'],  # X軸に日時
    y=data['Close'], # Y軸に株価(整数化済み)
    mode='lines+markers',  # 折れ線+マーカー
    name='Close Price',
    marker=dict(size=5, color='blue'),
    line=dict(color='blue', width=2)
))

newplot.png

0Like

Your answer might help someone💌