带有colorbar和datetime轴刻度的散点图

时间:2017-11-11 04:18:09

标签: python pandas datetime matplotlib colorbar

我迷失了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'

如何同时使用彩条和格式化轴?

2 个答案:

答案 0 :(得分:1)

请勿调用散点ax。 (这会覆盖现存轴ax。)
colorbar期望ScalarMappable作为第一个参数(例如散点图)。由于散点图都已标准化,因此您可以在循环中使用它,

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

然后,

clb = fig.colorbar(scatter)

剩下的应该保持不变。

答案 1 :(得分: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')

现在添加colorbar:

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