Python 带有颜色条和日期时间轴刻度的散点图

Python 带有颜色条和日期时间轴刻度的散点图,python,pandas,datetime,matplotlib,colorbar,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.da

我在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:“AxeSubplot”对象没有属性“autoscale\u None”

但是如果我指定我的ax作为散点图,这样我就可以进行颜色编码,那么我的axis格式化程序就有问题了。 相反,写入ax=plt.scatter会生成AttributeError:“PathCollection”对象没有属性“xaxis”


如何同时使用颜色条和格式化轴标记?

基本思想是需要为颜色条添加额外的轴

很难知道这是否完全匹配,因为您还没有提供一个包含数据的工作示例。但这至少可以作为一个模板

首先,一些示例数据:

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)   

不要叫散射斧。这将覆盖现有的ax轴。 colorbar希望第一个参数是ScalarMapable,例如散射。由于散射体都已规格化,因此可以从循环中使用

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

clb = fig.colorbar(scatter)

其余部分应保持不变。

抱歉,请澄清,这对我的循环如何起作用?当我没有单个数据帧但有多个数据帧时,如何设置标量可映射性?我需要一个共同的颜色栏共同的颜色方案,为许多不同的值范围的数据帧。请注意,当设置ax=plt.scatter时,我的颜色条代码工作得很好,只要我保持数字x轴。当我开始使用axis格式时,问题就出现了。如果你需要一个通用的颜色条,那么颜色条没有很多不同的范围,你只有一个。选择完整数据集的最小值和最大值以设置可映射。循环可以保持不变,我只是为一个数据帧制作了示例数据,以提供一个工作示例。话虽如此,看起来ImportanceOfBeingErnest的答案更简单,我将第一个承认我在Matplotlib方面没有很好的优雅感。试试他的方法!当然我真傻,谢谢你。这很尴尬。