Python 在DelCiCo条形码的每个颜色中间放置蜱

Python 在DelCiCo条形码的每个颜色中间放置蜱,python,matplotlib,matplotlib-basemap,Python,Matplotlib,Matplotlib Basemap,我需要改变我的色条记号的位置,我需要帮助这样做。到目前为止,我已经尝试了一些方法,但没有一种效果令人满意 我有以下类型的数据帧: import pandas as pd import random country_iso = ['RU', 'FR', 'HU', 'AT', 'US', 'ES', 'DE', 'CH', 'LV', 'LU'] my_randoms=[random.uniform(0.0, 0.3) for _ in range (len(country_iso))] df =

我需要改变我的色条记号的位置,我需要帮助这样做。到目前为止,我已经尝试了一些方法,但没有一种效果令人满意

我有以下类型的数据帧:

import pandas as pd
import random
country_iso = ['RU', 'FR', 'HU', 'AT', 'US', 'ES', 'DE', 'CH', 'LV', 'LU']
my_randoms=[random.uniform(0.0, 0.3) for _ in range (len(country_iso))]
df = pd.DataFrame({'iso':country_iso, 'values':my_randoms})
df.loc[df.iso.str.contains('US')]= ['US', 0]
df['binned']=pd.cut(df['values'], bins=[-0.01, 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3], labels=[0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3])
df.binned = pd.to_numeric(df.binned, errors='coerce')
df = df[['iso', 'binned']]
正如您所看到的,这是一个数据帧,其中iso国家/地区值作为一列,而一些国家/地区值作为第二列,其二进制值介于0和0.3之间。US的值为0,我希望它具有独特的颜色。然后,我继续从创建一个带有shapefile的底图

我创建了蓝色的cmap,但将第一种颜色更改为红色。这是因为我希望值为0的国家具有不同的颜色。每样东西都工作得非常出色,但是如果你看一下颜色条,就会发现刻度偏离了中心


有人知道如何更正我的代码吗?非常感谢

将您的示例简化为要点,您可以通过扩展传递给映射器的范围来实现所需。我想,将colormap扩展到负值是否有意义取决于具体的用例。无论如何,这里有一个完整的示例,没有此问题不需要的
Basemap
shapefile

from matplotlib import pyplot as plt, colors as clr, cm
import numpy as np

fig= plt.figure()
ax = plt.subplot2grid((1,20),(0,0), colspan=19)
cax = plt.subplot2grid((1,20),(0,19))

upper = 0.3
lower = 0.0
N = 7

cmap = clr.LinearSegmentedColormap.from_list(
    'custom blue', ['#d0dfef', '#24466b'], N=N
)
cmap._init()
cmap._lut[0,: ] = np.array([200,5,5,200])/255.0
norm = clr.Normalize()

mapper = cm.ScalarMappable(norm=norm, cmap=cmap)

deltac = (upper-lower)/(2*(N-1))

mapper.set_array(np.linspace(lower-deltac,upper+deltac,10)) #<-- the 10 here is pretty arbitrary
clb = fig.colorbar(mapper, shrink=0.19, cax=cax)

plt.show()
生成的绘图如下所示:


您正在执行
LinearSegmentedColormap。从_列表(…,N=7)
但是7不能“很好地”进入0.3。试试
N=6
?我不确定“零”在这里的作用。如果把0放在彩色图的红色部分的中间,则意味着在-0.025和+0.025之间的值被用红色着色,而不仅仅是0本身。这就是你要问的吗?你可以用最少的例子轻松地问你的问题。请这样做,你将有更多的机会得到一个好的答案,这将对其他人更有用。我已经减少了很多代码,并在阅读了你的评论@Tom之后做了进一步的减少。我对python有些陌生,对绘图更是如此,不确定如何进一步减少它。似乎不需要底图来回答这个问题,但我不知道。至于颜色部分,不幸的是,n=6并不能解决这个问题,尽管它看起来确实更好。至于0值,0附近的间隔非常小,它只捕获值为0的国家。我认为你的问题是可以的。每个人都能看出你是个新手。将来,只要有可能,试着发布可以“开箱即用”运行的示例代码,以解决“此代码无法正常工作”类型的问题。有关此操作的更多信息,请参阅。还要注意的是,您的代码中存在一些缩进问题——我猜这是因为将原始代码缩减为显示的版本。嗨,Thomas,感谢您花时间将代码缩减为基本内容并找到答案。不幸的是,到目前为止,我还无法调整您的答案以使其在我的情况下起作用,但我相信我会达到目的。@Wald基本上,您需要更改的只是代码中的
映射器。set_array
行。您可以将打印的数据与用于调整颜色栏的数据完全解耦。这就是为什么我选择了一个简单的
numpy
数组来进行调整。@Wald实际上你甚至可以跳过
numpy.linspace
,只需编写
mapper.set\u数组([lower deltac,upper+deltac])
。我觉得很愚蠢,但我到底需要更改什么呢?阅读您的答案后,我做的第一件事就是更改mapper.set_数组,但由于某些原因,这并不能解决问题。我想这可能是因为我可能不得不根据您的示例调整upper/lower和deltac(我刚刚复制了它们),但这些是我使用的值。谢谢你的耐心。哇,非常感谢你。我真的很感谢你花时间和精力来帮助我。那很好用。
from matplotlib import pyplot as plt, colors as clr, cm
import numpy as np

fig= plt.figure()
ax = plt.subplot2grid((1,20),(0,0), colspan=19)
cax = plt.subplot2grid((1,20),(0,19))

upper = 0.3
lower = 0.0
N = 7

cmap = clr.LinearSegmentedColormap.from_list(
    'custom blue', ['#d0dfef', '#24466b'], N=N
)
cmap._init()
cmap._lut[0,: ] = np.array([200,5,5,200])/255.0
norm = clr.Normalize()

mapper = cm.ScalarMappable(norm=norm, cmap=cmap)

deltac = (upper-lower)/(2*(N-1))

mapper.set_array(np.linspace(lower-deltac,upper+deltac,10)) #<-- the 10 here is pretty arbitrary
clb = fig.colorbar(mapper, shrink=0.19, cax=cax)

plt.show()
from matplotlib import pyplot as plt, colors as clr, cm
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
import pandas as pd
import random
country_iso = ['RU', 'FR', 'HU', 'AT', 'US', 'ES', 'DE', 'CH', 'LV', 'LU']
my_randoms=[random.uniform(0.0, 0.3) for _ in range (len(country_iso))]
df = pd.DataFrame({'iso':country_iso, 'values':my_randoms})
df.loc[df.iso.str.contains('US')]= ['US', 0]
df['binned']=pd.cut(df['values'], bins=[-0.01, 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3], labels=[0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3])
df.binned = pd.to_numeric(df.binned, errors='coerce')
df = df[['iso', 'binned']]

import numpy as np
from matplotlib.collections import PatchCollection
from matplotlib.ticker import FuncFormatter

shapefile_path = 'shapefiles/'

fig, ax = plt.subplots()#figsize=(10,20))

upper = 0.3
lower = 0.0
N = 7

deltac = (upper-lower)/(2*(N-1))

m = Basemap(resolution='c', # c, l, i, h, f or None
            projection='mill',
            llcrnrlat=-62, urcrnrlat=85,
            llcrnrlon=-180, urcrnrlon=180,
            ax = ax,
            )
m.readshapefile(shapefile_path+r'ne_110m_admin_0_countries', 'areas')
df_poly = pd.DataFrame({
    'shapes': [Polygon(np.array(shape), True) for shape in m.areas],
    'iso': [gs['ISO_A2'] for gs in m.areas_info]
})

df_poly = df_poly.merge(df, on='iso', how='inner', indicator=True)

cmap = clr.LinearSegmentedColormap.from_list('custom blue', ['#d0dfef', '#24466b'], N=N)
cmap._init()
cmap._lut[0,: ] = np.array([200,5,5,200])/255.0

pc = PatchCollection(df_poly[df_poly[df.columns[1]].notnull()].shapes, zorder=2)
norm = clr.Normalize()

pc.set_facecolor(cmap(norm(df_poly[df_poly[df.columns[1]].notnull()][df.columns[1]].values)))
ax.add_collection(pc)

mapper = cm.ScalarMappable(norm=clr.Normalize(), cmap=cmap)
mapper.set_array([lower-deltac,upper+deltac])
clb = plt.colorbar(mapper, shrink=0.55)

plt.show()