Matplotlib颜色条更改刻度标签和定位器。

7
我想要更改以下图表的颜色条中刻度定位器和标签。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import dates as mdates
import numpy as np

# fontdict to control style of text and labels
font = {'family': 'serif',
        'color':  (0.33, 0.33, 0.33),
        'weight': 'normal',
        'size': 18,
        }

num = 1000
x = np.linspace(-4,4,num) + (0.5 - np.random.rand(num))
y = np.linspace(-2,2,num) + (0.5 - np.random.rand(num))
t = pd.date_range('1/1/2014', periods=num)

# make plot with vertical (default) colorbar
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6, 6))
ax.set_title('Scatter plot', fontdict=font)

# plot data
s = ax.scatter(x = x, y = y, 
               s=50, c=t, marker='o', 
               cmap=plt.cm.rainbow)

# plot settings
ax.grid(True)
ax.set_aspect('equal')
ax.set_ylabel('Northing [cm]', fontdict=font)
ax.set_xlabel('Easting [cm]', fontdict=font)

# add colorbar
cbar = fig.colorbar(mappable=s, ax=ax)
cbar.set_label('Date')

# change colobar ticks labels and locators
????

颜色条展示了时间依存性。因此,我想把刻度从数值(纳秒?)改为更合理的日期格式,比如月份和年份(例如%b%Y或%Y-%m),其中间隔可以是3或6个月。这是否可行?

我尝试过使用cbar.formatter、cbar.locator和mdates,但都没有成功。

2个回答

6

您可以保留由colorbar函数提出的相同定位器,但更改刻度标签以按以下格式打印格式化日期:

# change colobar ticks labels and locators 
cbar.set_ticks([s.colorbar.vmin + t*(s.colorbar.vmax-s.colorbar.vmin) for t in cbar.ax.get_yticks()])
cbar.set_ticklabels([mdates.datetime.datetime.fromtimestamp((s.colorbar.vmin + t*(s.colorbar.vmax-s.colorbar.vmin))/1000000000).strftime('%c') for t in cbar.ax.get_yticks()])
plt.show()

以下是结果:格式化日期为色条刻度

如果您真的想控制刻度位置,可以计算所需的值(这里为大约3个月间隔的 ~91.25 天):

i,ticks = 0,[s.colorbar.vmin]
while ticks[-1] < s.colorbar.vmax:
   ticks.append(s.colorbar.vmin+i*24*3600*91.25*1e9)
   i = i+1
ticks[-1] = s.colorbar.vmax
cbar.set_ticks(ticks)
cbar.set_ticklabels([mdates.datetime.datetime.fromtimestamp(t/1e9).strftime('%c') for t in ticks])

2

Matplotlib的颜色映射机制没有像x或y轴那样的“单位”概念,因此您可以在映射之前手动将日期转换为浮点数,然后手动设置定位器和格式化程序。您还可以查看pandas如何将其日期对象映射到浮点数,它可能与本地matplotlib映射有所不同:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

dates = np.datetime64('2019-11-01') + np.arange(10)*np.timedelta64(1, 'D')
X= np.random.randn(10, 2)

plt.scatter(X[:, 0], X[:, 1], c=mdates.date2num(dates))
cb = plt.colorbar()
loc = mdates.AutoDateLocator()
cb.ax.yaxis.set_major_locator(loc)
cb.ax.yaxis.set_major_formatter(mdates.ConciseDateFormatter(loc))
plt.show()

boo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接