Matplotlib:使用PySAL自然中断时颜色条断开

时间:2016-04-30 21:35:37

标签: python pandas matplotlib

我根据this tutorial创建了一个等值区域地图。

但不是将数据分成相等的间隔,如下所示:

bins = np.linspace(values.min(), values.max(), 7)

我使用PySAL的Jenks自然休息,因为我的数据分布不均:

from pysal.esda.mapclassify import Natural_Breaks as nb
# values is a pandas Series 
breaks = nb( values, initial=150, k = 7)

这使得地图颜色看起来很好,但它弄乱了传说:

legend1

所以我尝试将Jenks颜色分配给地图,并且与图例的间隔相等,但是会发生这种情况:

legend2

为彩条指定了正确的刻度标签,但位置错误。所以我的问题是:我怎样才能将colorbar设置为相等的间隔,但将tick标签设置为正确位置的Natural Breaks值?

以下是图例的相关代码:

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from pysal.esda.mapclassify import Natural_Breaks as nb

values = pd.Series([71664, 65456, 60378, 50128, 46618, 44028, 42642, 41237, 35300, 34891, 34848, 33089, 29964, 25193, 25088, 23879, 23458, 18149, 16537, 15576, 15235, 14741, 11981, 11963, 11616, 10280, 9723, 9720, 9709, 9659, 9649, 9631, 9369, 8345, 8211, 7809, 7758, 7119, 7034, 6979, 6455, 5861, 5580, 5498, 5469, 5448, 5317, 4749, 4498, 4254, 4152, 3876, 3861, 3836, 3813, 3786, 3655, 3582, 3475, 2922, 2870, 2866, 2849, 2634, 2598, 2185, 1950, 1924, 1886, 1879, 1794, 1756, 1702, 1700, 1637, 1632, 1524, 1505, 1453, 1415, 1396, 1345, 1327, 1306, 1250, 1125, 1084, 1079, 1025, 976, 920, 903, 877, 868, 842, 815, 803, 799, 799, 792, 762, 725, 718, 714, 710, 660, 654, 647, 617, 616, 611, 600, 588, 572, 572, 567, 547, 536, 522, 482, 463, 439, 434, 428, 419, 415, 412, 410, 395, 390, 389, 386, 375, 374, 370, 345, 338, 325, 324, 285, 276, 272, 250, 236, 229, 227, 226, 216, 213, 209, 203, 200, 186, 186, 182, 182, 175, 173, 170, 169, 164, 164, 159, 155, 153, 148, 147, 140, 131, 129, 127, 127, 126, 124, 119, 117, 115, 114, 111, 109, 105, 103, 101, 97, 90, 89, 89, 85, 84, 77, 76, 74, 72, 71, 70, 70, 69, 62, 61, 61, 60, 57, 54, 53, 53, 51, 50, 50, 48, 44, 43, 42, 35, 34, 30, 29, 26, 23, 20, 19, 16, 15, 15, 12, 11, 9, 8, 8, 5, 3, 1])

num_colors = 7
# Jenks natural breaks for colormap
breaks = nb( values, initial=150, k = num_colors - 1)
bins = breaks.bins

# Orange-Red colormap 
cm = plt.get_cmap('OrRd')
scheme = cm(1.*np.arange(num_colors)/num_colors)
fig = plt.figure(figsize=(19, 7))
ax_legend = fig.add_axes([0.35, 0.15, 0.3, 0.03], zorder=3)
cmap = mpl.colors.ListedColormap(scheme)

# Round legend ticks to nearest 100
legend_bins = np.around(bins, decimals = -2)
# Split colormap into equal intervals
legend_colors = np.linspace(values.min(), values.max(), num_colors)
cb = mpl.colorbar.ColorbarBase(ax_legend, 
                               cmap=cmap, 
                               ticks=legend_bins, 
                               boundaries=legend_colors, 
                               orientation='horizontal' )

1 个答案:

答案 0 :(得分:3)

经过多次摔跤,我找到了答案。这一切都是关于将ticksboundaries参数设置为相同的东西,即垃圾箱。然后将刻度设置为legend_colors

使其运作的相关位是:

cb = mpl.colorbar.ColorbarBase(ax_legend, 
                               cmap=cmap, 
                               ticks=bins, 
                               boundaries=bins, 
                               orientation='horizontal' )
cb.set_ticks(legend_colors[1:])