Python 带有颜色条和日期时间轴刻度的散点图
我在matplotlib中使用的不同方法中迷失了方向 我想创建一个彩色编码的散点图,边上有一个彩色条,x轴上有日期时间 但根据我如何定义我的ax,我会得到不同的错误。 以下是我的代码的核心: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
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方面没有很好的优雅感。试试他的方法!当然我真傻,谢谢你。这很尴尬。