簡體   English   中英

帶有顏色欄和日期時間軸刻度的散點圖

[英]Scatter plot with colorbar and datetime axis ticks

我迷失在matplotlib中使用的不同方法中。

我想創建一個顏色編碼的散點圖,在側面帶有一個色條,在x軸上帶有日期時間。

但是根據我定義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'

如何同時獲得顏色欄和格式化的軸刻度?

不要叫分散ax (這將覆蓋現有的軸ax 。)
彩條期望將ScalarMappable(例如散點圖)作為第一個參數。 由於分散均已標准化,因此您可以從循環中使用它,

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

然后,

clb = fig.colorbar(scatter)

其余應保持不變。

基本思想是您需要為色條添加一個額外的軸。

很難知道這是否完全匹配,因為您還沒有提供一個有效的數據示例。 但這至少可以用作模板。

首先,一些示例數據:

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)   

散點圖和顏色圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM