我迷失了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'
。
如何同时使用彩条和格式化轴?
答案 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)