Python 在自带colorbar的基础上自定义颜色

Python 在自带colorbar的基础上自定义颜色

python 拥有众多的色彩设置,但有时候并不能满足作者的需要,因此本文介绍了一种在原有的colorbar的基础上,设定自己颜色的方法。

主要代码

下面是一个具体的例子

# -*- coding: utf-8 -*-
import os
import gzip
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib import cm
from matplotlib.colors import LinearSegmentedColormap

#在自带的colorabar "jet" 的基础上修改,得到自己想要的颜色
def get_spectral():

    colormap_float = np.zeros( (256, 3), np.float ) #新建一个数组用于存储颜色的数值
 
    for i in range(0, 256, 1):
       colormap_float[i, 0] = cm.jet(i)[0] * 255.0
       colormap_float[i, 1] = cm.jet(i)[1] * 255.0
       colormap_float[i, 2] = cm.jet(i)[2] * 255.0 #将原有的 "jet"颜色赋值到colormap_float中
       colormap_float[255, :] = [130, 130, 130]    #自定义了一些颜色的数值,作者可以根据需要自己设置
       colormap_float[254, :] = [0, 0, 0]
       colormap_float[253, :] = [182, 251, 255]
       colormap_float[252, :] = [255, 255, 255]
       colormap_float[251, :] = [255, 84, 156]
    # np.savetxt("jet_float.txt", colormap_float, fmt = "%f", delimiter = ' ', newline = '\n')
    # np.savetxt("jet_int.txt", colormap_int, fmt = "%d", delimiter = ' ', newline = '\n')

    return( colormap_float )
############################################################################
def read_gz_file(path):
    contents = []
    if os.path.exists(path):
        with gzip.open(path, 'rb') as fp:
            contents = fp.read()
    else:
        print('File not exist! continue') 
    return contents
#############################################################################
def draw_sst(data, name_string, scale, offset, lon, lat, colormap_float):
    temp = data[0, :, :]
    index_valid = np.where(temp <= 250)
    # temp[index_valid] = temp[index_valid] * scale[0] + offset[0]
    min_value = np.round( np.min( temp[index_valid] ) * 
                         scale[0] + offset[0] )
    max_value = np.round( np.max( temp[index_valid] ) * 
                         scale[0] + offset[0] )
    
    rgb_table = LinearSegmentedColormap.from_list('sst cmap', colormap_float / 255.0) #这段是比较关键的代码,将获取的rgb数值转换成哈希表的格式,我将其命名为'sst cmap'
    fig = plt.figure( "数据显示" )
    # ax = fig.add_subplot()
    ax = plt.axes()
    # ax.foo = 'bar'
    m = Basemap(projection = 'cyl', llcrnrlon = 0,
                    llcrnrlat = -90, urcrnrlon = 360, urcrnrlat = 90,
                    lon_0 = 180., lat_0 = 0., resolution = 'l')
    X,Y = m(lon, lat)
    c = m.pcolor(X, Y, temp, cmap = rgb_table)
    ax.set(title = "GMI v8.2 Sea Surface Temperature 2019/08 "
          "- monthly average - Global")
    # ax.axhline(y=75, color='g', linestyle='--')
    # ax.axhline(y=90, color='r', linestyle='--')
    # rect = plt.Rectangle((10,10),10,10,linewidth=3,edgecolor='r',facecolor='red', alpha=1)
    # ax.add_patch(rect)
    m.drawmapboundary(fill_color = 'aqua')
    m.shadedrelief()
    # m.fillcontinents(color = 'grey', lake_color = 'w')
    m.drawlsmask(land_color='grey')
    m.drawcoastlines()
    parallels = np.arange(-90.,91.,30.)
    m.drawparallels(parallels,labels=[True,False,False,False])
    meridians = np.arange(-180.,181.,60.)
    m.drawmeridians(meridians,labels=[False,False,False,True])
    m.colorbar(c)



if __name__ == "__main__":
    Dir = r"H:\LNHCourse\6"
    file_path = Dir + r'\f35_201908v8.2.gz'
    row = int( 360/0.25) ; line = int( 180/0.25 )
    data = read_gz_file(file_path)
    data = np.array(bytearray(data)).reshape(6, line, row)

    scale = np.array( [0.15, 0.2, 0.2, 0.3, 0.01, 0.1] )
    offset = np.array( [-3, 0, 0, 0, -0.05, 0] )
    name_string = np.array( ['SST','wspd_lf','wspd_mf','vapor',
                               'cloud','rain'] )
    lon = (  np.linspace(1, 1, 720).reshape( (720, 1) ) @ 
       np.linspace(0., 360., 1440).reshape( (1, 1440) )  )
    lat = (  np.linspace(-90., 90., 720).reshape( (720, 1) ) @ 
       np.linspace(1, 1, 1440).reshape( (1, 1440) )  )

    colormap_float = get_spectral() #调用自定义的获取颜色大的函数,colormap_float是我们想要的数组
    sst = draw_sst(data, name_string, scale, offset, lon, lat, 
                   colormap_float)           

结果如图所示

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 Python 中使用自定义颜色来绘制 colorbar,您可以使用 Matplotlib 库中的 `matplotlib.pyplot.colormap` 函数来创建自定义颜色映射。然后,您可以使用 `matplotlib.pyplot.colorbar` 函数来绘制 colorbar,并将自定义颜色映射作为参数传递给该函数。 示例代码: ``` import matplotlib.pyplot as plt import numpy as np # Create data data = np.random.rand(10,10) # Create custom colormap cmap = plt.colormap(['blue', 'red']) # Create heatmap using custom colormap plt.imshow(data, cmap=cmap) # Add colorbar plt.colorbar() # Show plot plt.show() ``` 这段代码会生成一个热图,并使用自定义颜色映射(blue,red)作为颜色条。 ### 回答2: Python中的matplotlib库提供了许多绘图功能,其中包括绘制颜色条(colorbar)的功能。颜色条可以用于显示图像或其他可视化数据中的值,通常使用默认颜色来表示不同值的范围。但是,有时我们需要使用自定义颜色来表示不同值的范围,这时就需要在Python自定义颜色条。 下面是一些实现自定义颜色条的基本步骤: 1.确定颜色条的值范围 自定义颜色条需要确定颜色条所表示的值范围。可以利用numpy库中的linspace函数生成一个等距的数值数组,数组的范围应该等于颜色条所表示的数据范围。 2.创建自定义颜色映射 在Python中,要创建自定义颜色条,需要先创建一个自定义颜色映射(cmap)。可以使用 LinearSegmentedColormap() 函数创建一个基于颜色端点的颜色映射。 颜色映射对象具有一个名为 __call__ 的方法,该方法使用0-1之间的值将数据映射到颜色映射中。 3.应用自定义颜色条 将自定义颜色条应用于绘图时,只需在plot、imshow或pcolor等函数中使用cmap参数来指定即可。 例如,可以使用以下代码创建一个从蓝色到红色的颜色条: ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap #确定值范围 values = np.linspace(0, 1, 100) #创建自定义颜色映射 cmap = LinearSegmentedColormap.from_list('my_cmap', ['blue', 'red']) #应用颜色条 plt.imshow(values.reshape((10, 10)), cmap=cmap) plt.colorbar() plt.show() ``` 需要注意的是,自定义颜色条应该根据不同的数据来选择适当的颜色映射方式。例如,如果数据是对称的,可以使用 "RdBu" 颜色条,如果数据集只包含正值,则可以使用 "Reds" 颜色条。决定颜色条的方式应基于对数据集的理解,以便用户能够正确地解释颜色条所表示的含义。 ### 回答3: Python中,colorbar是一种常用的颜色图例,可以帮助用户更好地解释数据。在某些情况下,用户需要根据需要自定义颜色条。本文将介绍如何在Python自定义颜色条。 在Python中,可以使用matplotlib库来创建、显示和保存图表。要自定义颜色条,需要使用matplotlib.pyplot.colorbar()函数。该函数提供了许多参数,可用于控制颜色条的外观和属性。下面是一些可用的常见参数: - cmap:指定颜色条使用的颜色映射。可以是一个字符串(例如“viridis”),也可以是一个自定义colormap对象。 - boundaries:定义颜色条的边界。如果您想要自己定义颜色条的颜色,可以使用boundaries参数。 - ticks:指定颜色条上的标记位置。 - orientation:指定颜色条的方向。可以是“vertical”或“horizontal”。 - label:指定颜色条的标签。 下面是一个简单的例子,利用cmap和bounds参数自定义一个颜色条: ``` import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 1, 50) y = np.linspace(0, 1, 50) X, Y = np.meshgrid(x, y) Z = X**2 + Y**2 fig, ax = plt.subplots() im = ax.imshow(Z, cmap='RdBu_r') bounds = np.array([0, 0.25, 0.5, 0.75, 1]) norm = plt.Normalize(bounds.min(), bounds.max()) colors = ["#DC143C", "#FFA07A", "#FFD700", "#9ACD32", "#228B22"] cmap = plt.cm.colors.ListedColormap(colors[1:-1]) cbar = ax.figure.colorbar(im, ax=ax, cmap=cmap, norm=norm, boundaries=bounds, ticks=bounds) cbar.ax.set_yticklabels(['0', '0.25', '0.5', '0.75', '1']) plt.show() ``` 在这个例子中,我们使用了RdBu_r颜色映射,但是通过colors参数我们改变了它的渐变蓝白红,设置四个断点。然后我们使用cmap和bounds参数在颜色条中指定自定义刻度。最后,我们将刻度设置为分别为0, 0.25, 0.5, 0.75, 1.。 总结一下,在Python自定义颜色条可以使用matplotlib.pyplot.colorbar()函数控制外观和属性。你可以使用cmap、boundaries、ticks、orientation和label等参数来设置颜色条的一些属性,以达到自定义颜色的目的。希望这个例子可以帮助你更好的掌握这些概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值