2017-11-11 60 views
0

matplotlibで使用されているさまざまな方法で迷子になりました。カラーバーと日時軸のティックを含む散布図

サイドにカラーバーとx軸にdatetimeという色分けされた散布図を作成したいとします。

私がaxをどのように定義するかによって、違うエラーが発生します。 以下は私のコードの中核である:私は指定した場合

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import matplotlib.cm as cm 
import matplotlib.dates as mdates 

#.....loading files etc. 

norm = mcolors.Normalize(vmin=0,vmax=1000) 
timerange = pd.date_range(start='2015-01-01', end='2016-01-01', freq='30D') 

### PLOTTING 
fig = plt.figure(figsize=(6.,5)) 
ax = fig.add_subplot(111) 

for Af in Afiles: 
    for index, row in Af.iterrows(): 
     time = pd.to_datetime(row['date'], format="%Y-%m-%d") 
     plt.scatter(time, row['A'], c=row['z'], norm=norm, cmap=colormap,edgecolor='k', lw=0.8, s=80) 

plt.xticks(timerange, rotation=90) 
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d/%m/%Y")) 
plt.xlabel('Time', fontsize=11, color='k') 

clb = fig.colorbar(ax)  
clb.ax.set_title('Value', y=-0.125, fontsize=11) 
clb.ax.invert_yaxis() 

fig.tight_layout() 

これはAttributeError: 'AxesSubplot' object has no attribute 'autoscale_None'

を生成するが、私のax、私は私のカラーコーディング作業を取得できるように、散布図は、私はその後に問題があるとして、軸フォーマッタ。 ax = plt.scatterを書くと、AttributeError: 'PathCollection' object has no attribute 'xaxis'が生成されます。

カラーバーとフォーマットされた軸のティックの両方を持つにはどうすればよいですか?

答えて

1

散布を呼び出さないでください。 (これは、既存の軸axを上書きします。
カラーバーは、最初の引数としてScalarMappable(たとえば散布図など)が必要です。飛散はすべて正規化されているので、あなたは同じに滞在する必要があり、ループから

その後
norm = plt.Normalize(...) 
for bla in blubb: 
    scatter = plt.scatter(..., norm=norm) 

clb = fig.colorbar(scatter) 

残りを使用することができます。

+0

もちろん!愚かな私、ありがとう。これは恥ずかしいです。 – durbachit

0

基本的な考え方は、カラーバーに余分な軸を追加する必要があるということです。

実際のデータの例を提供していないので、正確に一致するかどうかは分かりません。しかし、これは少なくともテンプレートとして役立つかもしれません。

まず、いくつかの例のデータ:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import matplotlib.cm as cm 
import matplotlib.dates as mdates 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

vmin = 0 
vmax = 1000 
timerange = pd.date_range(start='2015-01-01', end='2016-01-01', freq='30D') 
N = len(timerange) 

data = np.random.randint(vmin, vmax, size=N) 
# z contains the colorbar values for each point 
cmap = plt.get_cmap('Reds') 
z = [cmap((x-vmin)/(vmax-vmin))[:3] for x in data] 
df = pd.DataFrame({"value":data, "datetime":timerange, "z":z}) 

今プロット:

fig = plt.figure(figsize=(6.,5)) 
ax = fig.add_subplot(111) 

plt.scatter(x=df.datetime.values, y=df.value.values, c=df.z) 

ax.set_xticklabels(timerange, rotation=90) 
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d/%m/%Y")) 
ax.set_xlabel('Time') 

今すぐカラーバーを追加します。

norm = mcolors.Normalize(vmin=vmin,vmax=vmax) 
m = cm.ScalarMappable(cmap='Reds', norm=norm) 
m.set_array([(x-vmin)/(vmax-vmin) for x in df.value.values]) 

divider = make_axes_locatable(ax) 
cax = divider.append_axes("right", size="5%", pad=0.1) 
clb = plt.colorbar(m, cax=cax) 

scatter plus colormap

+0

申し訳ありませんが、明確にするために、これは私のループでどのように機能しますか?単一のデータフレームを持たずに多くのスカラーをマッピング可能に設定するにはどうすればよいですか?私は多くの異なる範囲の値を持つ多くのデータフレームに共通のカラーバー(共通のカラースキーム)が必要です。 カラーバーのコード( 'ax = plt.scatter'を設定するとき)は、数値x軸を保持していれば完璧に動作することに注意してください。この問題は、軸の書式設定で再生を開始したときに表示されました。 – durbachit

+0

一般的なカラーバーが必要な場合は、カラーバーに対してさまざまな範囲がありません。完全なデータセットの最小値と最大値を選択して、マッピング可能な値を設定します。ループは同じままでもかまいません。実例を示すために、1つのデータフレームのサンプルデータを作成しました。 –

+1

それは、それがImportanceOfBeingErnestの答えが簡単であるように見えます、そして、私はMatplotlibに関しては優雅さには良い意味がないことを認めている最初の人になります。彼のアプローチを試してみてください! –

関連する問題