2017-11-29 4 views
1

私は1948年の月平均気温を含むnetCDFファイルを持っています。割り当てには、データポイントを1つ選択し、 12月、1月、2月、3月の月を表示し、表示します。リスト内包表記を使用して辞書のリストに格納されたプロットデータ

私はすでにデータを解凍してきたし、ここに示したように、私はそれが、辞書のリストに収集した12月については

:1月、2月に対応する

decemberMeans = [ 
    {'year': 1948, 'temp': 271.24}, {'year': 1949, 'temp': 271.28}, 
    {'year': 1950, 'temp': 268.52}, {'year': 1951, 'temp': 269.63}, 
    ..., 
    {'year': 2015, 'temp': 277.23}, {'year': 2016, 'temp': 271.25} 
] 

データを、そして3月は同じように構成されています。

私の次のステップはそれをプロットすることです。私は、各データセットについて同じグラフに1行をプロットしなければなりません。リスト内包表記を使ってそれを行います。今、私のプロットのコードは次のようになります。

import matplotlib.pyplot as plt 

plt.figure(1) 
plt.hold(True) 
plt.plot([data['years'] for data in decemberMeans], \ 
    [data['temp'] for data in decemberMeans], 'k-') 
plt.plot([data['years'] for data in januaryMeans], \ 
    [data['temp'] for data in januaryMeans], 'r-') 
plt.plot([data['years'] for data in februaryMeans], \ 
    [data['temp'] for data in februaryMeans], 'b-') 
plt.plot([data['years'] for data in marchMeans], \ 
    [data['temp'] for data in marchMeans], 'y-') 
plt.grid(True) 
plt.show() 
plt.close() 

それはうまくプロットが、私は私のリストの内包のすべてが本当に冗長であることがわかります。辞書の値を1つの鳥の餌食に入れて、それぞれのセットに対してdata['...'] for data in listを2回書く必要がないようにする方法がありますか?


P.S. - 私はこれを書いているので、プロットを行う関数を書くことができたことに気付きました(この記事を書くよりも時間がかかりそうですが)。私はまだ知りたいのです。すべてのおかげで、事前に!

答えて

1

はいpandasは間違いなく行く方法です!例hereを見てください(2番目の例は、その形式でデータを取得できる場合は、正確に必要なものにする必要があります)。より一般的には、あなたが遭遇した繰り返しの種類を避けるためにできることがいくつかあります。

一般的に使用されているコードの関数を書くことは、大変なスタートです。

def myplot(monthMeans, marker): 
    plt.plot([data['years'] for data in monthMeans], 
      [data['temp'] for data in monthMeans], 
      marker) 

そしてアクティブフィギュアに、各系列をプロットするためにあなたのコードは次のようになります:あなたはすでにこのようなものが出ているようですね

myplot(decemberMeans, 'k-') 
myplot(januaryMeans, 'r-') 
myplot(februaryMeans, 'b-') 
myplot(marchMeans, 'y-') 

しかし、これはまだ理想的ではない - どのような場合にはmyplotの名前を変更して、すべての行を変更しなければなりませんでしたか?

allMonthMeans = [decemberMeans, januaryMeans, ...] 
markers = ['k-', 'r-', ...] 

# 'zip' loops over the two lists simultaneously 
for monthMeans, marker in zip(allMonthMeans, markers): 
    myplot(monthMeans, marker) 
+0

ねえ、マジックジップはいいアイデアです!ありがとう!ほとんどの機能を使って、間違いなくそれを追加します。 – nat5142

1

あなたはそのためのpandasを使用することができます。

import matplotlib.pyplot as plt 
import pandas as pd 

decemberMeans = [ 
    {'year': 1948, 'temp': 271.24}, {'year': 1949, 'temp': 271.28}, 
    {'year': 1950, 'temp': 268.52}, {'year': 1951, 'temp': 269.63}, 
    {'year': 2015, 'temp': 277.23}, {'year': 2016, 'temp': 271.25} 
] 
df = pd.DataFrame(decemberMeans) 

plt.figure(1) 
plt.plot(df['year'], df['temp'], 'k-') 
+0

ここで私が今質問したすべての質問に対する答えは、パンダだと思われるので、あなたは何かを短くすることができます。私はおそらくそれにもう少し私の熟練を上げるべきです。助けてくれてありがとう! – nat5142

関連する問題