2017-03-04 119 views
3

我想將滴答和標籤添加到顏色欄,但它似乎不會顯示在輸出中。我嘗試了兩種方法(如下面的代碼所示)。第二種方法是按照Stack Overflow的另一個問題所示:How to add Matplotlib Colorbar Ticks無法添加matplotlib colorbar刻度

我必須忽略一些非常簡單的東西,因爲我是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標籤。感謝您的時間

回答

0

當繪製hexbin圖與模式bins = 'log'時,顏色將繪製與對數縮放。這意味着如果數據的最小值,平均值和最大值分別爲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() 
+0

這正是我一直在尋找。我錯過了將值轉換爲log10,並不知道最小的顏色條實際上是log10(min + 1)。謝謝! – bartman

+0

好極了,所以如果這回答了你的問題,請考慮[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)並加註它。 – ImportanceOfBeingErnest

+0

嗨,再次感謝您讓我知道在這裏接受答案,不知道這件事。我嘗試了upvote它,但似乎它不會公開展示,除非我的聲望超過15,儘管我的upvote會被記錄下來。當我的聲望高於15時,我會再次投票贊成。 – bartman