无法添加matplotlib颜色条刻度

3
我试图在一个色条中添加标记和标签,但在输出中似乎没有显示出来。我尝试了两种方法(如下所示的代码)。第二个方法是按照Stack Overflow上的另一个问题所示进行的: How to add Matplotlib Colorbar Ticks
我一定是忽视了非常简单的东西,因为我是Matplotlib和Python的初学者。
我成功地获得了彩色条,但我想要的刻度就是不显示。任何帮助都将非常感激,因为我已经在尝试和搜索之后卡了几个小时。这是我使用hexbin在basemap上生成热图的代码。
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.colors import LinearSegmentedColormap
from matplotlib import cm

#Loading data from CSV file
DATA_FILE = '....../Population_data.csv'
roc_data = pd.read_csv(DATA_FILE)
roc_data.head()

#Creating figure window
fig = plt.figure(figsize=(14,10))
ax = fig.add_subplot(111)

#Drawing the basemap
m = Basemap(projection='merc', lat_0=43.12, lon_0=-77.626,
resolution = 'i',llcrnrlon=-78.236, 
                llcrnrlat=42.935,
                urcrnrlon=-77.072, 
                urcrnrlat=43.349)
m.drawcoastlines()
m.drawcounties(zorder=20, color='red')
m.drawcountries()
m.drawmapboundary()

#plotting the heatmap using hexbin
x, y = m(roc_data['Longitude'].values, roc_data['Latitude'].values)
values = roc_data['Total(20-64)']
m.hexbin(x, y, gridsize = 125, bins = 'log', C = values, cmap = cm.Reds)


#Defining minimum, mean and maximum population values
max_p = roc_data['Total(20-64)'].max()
min_p = roc_data['Total(20-64)'].min()
mean_p = roc_data['Total(20-64)'].mean()

#Adding Colorbar
cb = m.colorbar(location = 'bottom', format = '%d', label = 'Population by Census Blocks')

#setting ticks

#cb.set_ticks([48, 107, 1302])                #First approach, didn't work 
#cb.set_ticklabels(['Min', 'Mean', 'Max'])

cb.set_ticks([min_p, mean_p, max_p])          #Second appraoch, assumed ticks and tick labels should be same
cb.set_ticklabels([min_p, mean_p, max_p])     #from the above mentioned stackoverflow question, but did't work

plt.show()

我使用第一种或第二种方法得到的colorbar ticks输出是相同的。如下图所示:热力图和没有刻度和标签的colorbar
我希望最小、中位数和最大人口值(分别为48、107和1302)在colorbar上显示,并标记为Min、Mean和Max。谢谢您的时间。
1个回答

0

当使用模式bins = 'log'绘制hexbin图时,颜色将以对数比例尺绘制。这意味着如果数据的最小值、平均值和最大值分别为minmeanmax,则它们在以对数比例尺绘制的色条上的值分别为log10(min)log10(mean)log10(max)

因此,色条上的刻度需要设置为对数值。刻度标签可以设置为任何值。但是,我认为仅仅在对数比例尺上放置类似于“平均值”的东西可能并不太有信息量。

一个特殊之处在于,色条的最小值实际上是log10(min+1)。这个+1是由于小于1的对数是负数。

下面是一个完整的示例。

enter image description here

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
from mpl_toolkits.basemap import Basemap
from matplotlib import cm

lon = -78.236+np.random.rand(1000)*(-77.072+78.236)
lat = 42.935 + np.random.rand(1000)*(43.349-42.935)
t = 99+np.random.normal(10,20,1000)
t[:50] = np.linspace(48,1302)
roc_data = pd.DataFrame({'Longitude':lon, 'Latitude':lat, "T":t })


#Creating figure window
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)

#Drawing the basemap
m = Basemap(projection='merc', lat_0=43.12, lon_0=-77.626,
resolution = 'i',llcrnrlon=-78.236, 
                llcrnrlat=42.935,
                urcrnrlon=-77.072, 
                urcrnrlat=43.349)
m.drawcoastlines()
m.drawcounties(zorder=20, color='red')
m.drawcountries()
m.drawmapboundary()

#plotting the heatmap using hexbin
x, y = m(roc_data['Longitude'].values, roc_data['Latitude'].values)
values = roc_data['T']
m.hexbin(x, y, gridsize = 125, bins = 'log', C = values, cmap = cm.Reds) #bins = 'log',

#Defining minimum, mean and maximum population values
max_p = roc_data['T'].max()
min_p = roc_data['T'].min()
mean_p = roc_data['T'].mean()
print [min_p, mean_p, max_p]
print [np.log10(min_p), np.log10(mean_p), np.log10(max_p)]

#Adding Colorbar
cb = m.colorbar(location = 'bottom', format = '%d', label = 'Population by Census Blocks') #format = '%d',

#setting ticks 
cb.set_ticks([np.log10(min_p+1), np.log10(mean_p), np.log10(max_p)])          
cb.set_ticklabels(['Min\n({:.1f})'.format(min_p), 'Mean\n({:.1f})'.format(mean_p), 'Max\n({:.1f})'.format(max_p)])
plt.tight_layout()
plt.show()

这正是我在寻找的。我错过了将值转换为log10,并不知道colorbar的最小值实际上是log10(min + 1)。谢谢! - bartman
很好,如果这个回答解决了你的问题,请考虑接受并给它点赞。 - ImportanceOfBeingErnest
再次您好,感谢您告诉我如何在这里接受答案,我之前不知道。我尝试点赞,但似乎除非我的声望超过15,否则它不会公开显示,尽管我的点赞将被记录。当我的声望超过15时,我会再次点赞的。 - bartman
您的点赞将被记录并在您达到15声望时立即显示,无需重新访问旧问题。 - ImportanceOfBeingErnest

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