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

2024-06-28 18:46:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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生成{}。在

如何同时具有colorbar和格式化轴刻度?在


Tags: importnorm编码matplotlibasfigcmplt
2条回答

基本思想是需要为colorbar添加一个额外的轴。在

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

首先,一些示例数据:

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})

现在绘制:

^{pr2}$

现在添加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

不要调用散点ax。(这将覆盖现有轴ax。)
colorbar希望第一个参数是ScalarMapTable(例如散布)。由于散射都是标准化的,所以可以从循环中使用它

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

然后

^{pr2}$

其余的应该保持不变。在

相关问题 更多 >