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

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

ただいまの
回答率

90.75%

  • Python

    6799questions

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

csvファイルの読み取り

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 452

ketchup

score 1

前提・実現したいこと

初めましてプログラムをはじめて間もないのですが、
現在csvファイルからデータを読み込みグラフを表示するプログラムを作っています。
csvは以下ののようになっています。(ファイル名は "日付".csv)

7:00  56.7
7:01  56.5
:      :
:      :
10:00 50.1

発生している問題・エラーメッセージ

グラフは問題なく表示できるのですがX軸が時間表示されません。
データの個数で表示されているようです。
これを時間に修正したいのですが、よくわかりません。

該当のソースコード

!/usr/bin /env python

import matplotlib.pyplot as plt
import pandas as pd
import datetime

d = datetime.datetime.today()
ymd = d.strftime("%Y%m%d")

A=pd.read_csv("/var/www/tempX/"+ymd+"b.csv")

plt.figure(figsize=(8,5))
plt.plot(maker="o")
plt.clf()
plt.title("A Line Temperature")
plt.xlabel("time")
plt.ylabel("temp")
plt.ylim([30,70])
plt.plot(A.T.values[1])

plt.show
plt.savefig(ymd+"B.png")

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

python2で実行

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

3点ほど。

1. pandasにてCSVデータを読み込む際に、0行目のデータを時系列データとして読み込んでください。
やり方としては、read_csv()の引数に parse_dates=[0]を記述するだけで時系列データとして読み込めると思います。

A=pd.read_csv("/var/www/tempX/"+ymd+"b.csv", header=None, sep=' ', parse_dates=[0])
print(A.head())
# =>                     0     1
#    0 2017-10-12 07:00:00  56.7
#    1 2017-10-12 07:01:00  56.5
#    2 2017-10-12 07:02:00  56.5
#    3 2017-10-12 07:03:00  56.5
#    4 2017-10-12 07:04:00  56.5

print(A[0].dtype)
# => datetime64[ns]

質問文のデータ形式に合わせて、上のコードでは セパレータをスペース(sep=' ')、ヘッダー部を無し(header=None) を指定しております。

2. plot()の引数にはXデータとYデータの両方を渡してください。
Yデータのみを渡すと、X軸は自動的に 0からのカウントデータになってしまいますので、X軸には上記で設定した1列目の時系列データを渡してください
あと細かいですが、

  • A.T.values[1] は A[1] でOK
  • marker = 'o' は データを渡すときに一緒に記述する

です。

# コレを
# plt.plot(A.T.values[1])
# ↓に修正
plt.plot(A[0], A[1], marker='o')

3.
時系列データをプロットすると軸の区切り間隔がおかしくなりますので、X軸に時系列用のlocatorを設定してください。
また、時刻ラベルのフォーマットを時系列用の formatter にて併せて設定しておくと良いかと思います。

https://matplotlib.org/api/dates_api.html

例えば、今回の場合は区切り間隔を1時間毎にすると適当かと思いますので、
locatorとして mdates.HourLocator()を設定します。
またこの際に、formatter を DateFormatter('%H:%M') しておくとよいでしょう。

以上をまとめるとこんな感じになるかと思います。

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import datetime

d = datetime.datetime.today()
ymd = d.strftime("%Y%m%d")

A=pd.read_csv("/var/www/tempX/"+ymd+"b.csv", header=None, sep=' ', parse_dates=[0])

fig = plt.figure(figsize=(8,5))
ax = fig.add_subplot(111)
ax.set_title("A Line Temperature")
ax.set_xlabel("time")
ax.set_ylabel("temp")
ax.set_ylim([30,70])
# 1時間毎に目盛り追加(Major)
ax.xaxis.set_major_locator(mdates.HourLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
# 10分ごとの目盛り追加(Mitor)
ax.xaxis.set_minor_locator(mdates.MinuteLocator([10,20,30,40,50]))
ax.plot(A[0],A[1], marker='o')

plt.show()
plt.savefig(ymd+"B.png")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/12 23:32

    なるほど、なんとなくイメージができました。
    ありがとうございました。

    キャンセル

+1

Pandas も matplotlib も使ったことがないので変なことをしていたらすみませんが、公式サンプルを見ると set_major_formatter() を使うと軸の書式を設定できるようです。

また Pandas にデータを取り込む際、第1カラムをヘッダかつ時刻データであることを定義して意味を持たせる方が、今後データを扱う上でなにかと便利だと思います。

from matplotlib.dates import DateFormatter
from matplotlib import pyplot as plt
import pandas as pd


A = pd.read_csv(
    '20171011b.csv', header=None,
    names=['Time', 'Temperature'], index_col='Time', parse_dates=True)

ax = plt.subplot()
ax.set_title("A Line Temperature")
ax.set_xlabel("time")
ax.xaxis.set_major_formatter(DateFormatter('%H:%M'))
ax.set_ylabel("temp")
ax.set_ylim(30, 70)
ax.plot(A)
plt.show()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/12 23:34

    なるほど、シンプルな表現でできるのですね。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6799questions

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