【问题标题】:Can't add matplotlib colorbar ticks无法添加 matplotlib 颜色条刻度
【发布时间】:2017-03-04 23:34:34
【问题描述】:

我正在尝试向颜色条添加刻度和标签,但它似乎没有显示在输出中。我尝试了两种方法(如下面的代码所示)。第二种方法是按照 Stack Overflow 上的另一个问题所示进行操作:How to add Matplotlib Colorbar Ticks

由于我是 Matplotlib 和 Python 的初学者,我必须在这里忽略一些非常简单的事情。

我设法获得了彩条,但我想要的刻度没有出现。在这里的任何帮助将不胜感激,因为在尝试和搜索后我已经坚持了几个小时。 这是我用来在底图上使用 hexbin 生成热图的代码。

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

我通过对颜色条刻度使用第一种或第二种方法得到的输出是相同的。就像这里一样: Heatmap and colorbar with no ticks and labels

我希望最小、中值和最大总体值(48、107 和 1302)显示在带有 Min、Mean 和 Max 标签的颜色条上。感谢您的宝贵时间

【问题讨论】:

    标签: python-3.x matplotlib matplotlib-basemap colorbar


    【解决方案1】:

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

    因此,颜色条上的刻度需要使用日志值进行设置。刻度标签可以设置为任何值。但是,我认为简单地将诸如“平均值”之类的东西放在对数刻度上可能不会提供太多信息。

    一个特殊性是颜色条的最小值实际上是log10(min+1)+1 是由于日志低于 1。

    这是一个完整的例子。

    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 并且不知道颜色条的最小值实际上是 log10(min+1)。谢谢!
    • 太好了,如果这回答了您的问题,请考虑 accepting 并点赞。
    • 您好,再次感谢您让我知道在这里接受答案,不知道。我尝试过投票,但除非我的声誉超过 15,否则它似乎不会公开展示,尽管我的投票会被记录下来。声望超过 15 分后,我会再次投票。
    • 您的点赞将被记录下来,并会在您的声望达到 15 时出现。无需重温旧问题。
    猜你喜欢
    • 2016-06-10
    • 2013-09-13
    • 1970-01-01
    • 2016-06-14
    • 2017-01-22
    • 2020-02-18
    • 2020-01-05
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多