matplotlib画渐变条形图

您所在的位置:网站首页 matplotlib画出颜色渐变 matplotlib画渐变条形图

matplotlib画渐变条形图

2022-11-29 04:57| 来源: 网络整理| 查看: 265

官网上的就是这个图,我也看了代码,我也查了很多人写的代码,写的介绍,但是感觉都没有介绍到要点,都是在糊弄,今天本着从我自己的画图理念出发,写一写我的理解。

我觉得画图主要的还是数据,数据不行,数据处理的不对,很有可能画不出来图,也导致出来的图没有新意,都是画折线图,画散点图。因此数据极为重要,第二部分,就是要巧妙地利用函数,一个合使的工具一个合适的函数,会起到四两拨千斤的感觉。

原理

原理主要是两个,一个是对imshow函数介绍, 一个是对图像位置调整。

这个渐变的柱状图,其实本质就是使用imshow函数。简单看下面这个案例:

import matplotlib.pyplot as plt import numpy as np a = np.array([[1, 2], [2, 1]]) plt.imshow(a) # plt.imshow(a, interpolation='bicubic') plt.show()

出来的结果就是这样的:

可以看出,上面的图很丑,虽然我们给了一个矩阵,虽然imshow将这个2x2的矩阵画出来,但是不好看,各个快的过度不平滑。哈哈哈,重点来了,我们将这个矩阵显示出来平滑一下看看什么效果:

import matplotlib.pyplot as plt import numpy as np a = np.array([[1, 2], [2, 1]]) # plt.imshow(a) plt.imshow(a, interpolation='bicubic') plt.show()

可以看到了吧,imshow函数自动将一个2x2矩阵平滑,以至于我们会怀疑时候是一个很大的矩阵做出来的。这里一个矩阵画出来了,但是要发出来一个矩阵条,还是要另外一个工作,就是设置位置,我们要知道如何控制位置才可以。

接下来在一个图里面画两个imshow图

import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() ax.set(xlim=(0,1.3), ylim=(0,0.6), autoscale_on=False) a = np.array([[1, 2], [2, 1]]) # plt.imshow(a) ax.imshow(a, interpolation='bicubic', extent=(0.1, 0.6, 0, 0.5)) ax.imshow(a, interpolation='bicubic', extent=(0.7, 1.2, 0, 0.5)) plt.show()

上面代码什么意思??我来通俗的来说!!!!!!但是事前介绍一下,matplotlib画图有很多风格,如果看过python数据科学手册都知道,有matlab风格的写法,还有别的写法。每个人搞的都不一样,我还是喜欢上面的写法:

fig, ax = plt.subplots()

这句话什么意思,简单的来说吧,就是fig就相当于画画的一个支架,ax就像是支架上的那个画布,你先在画布上画好,然后你把这个支架端出来(也就是plt.show())。

我觉得这样写的有什么好处,就是很方便,你可以任意在画布上画任何东西,尤其是内容复杂的时候,我觉得这样更加方便,但是我也是新手,我目前就打算这么锻炼我自己。

既然ax是画布,我们在画画之前肯定要设置你用多大纸,这里我选择的是

x0----1.3 y: 0 -----0.6(仔细观察下面的图的坐标轴就可以看得到,写成(0, 1.3), (0, 0.6)我觉得这个逻辑大部分人都可以理解这个设计理念。

接下来就是在画布上设置我要画的第一个区域,ax.imshow(a, interpolation='bicubic', extent=(0.1, 0.6, 0, 0.5))。这句话说,我要在x:0.1-0.6 y: 0-0.5区域画第一个图。ax.imshow(a, interpolation='bicubic', extent=(0.7, 1.2, 0, 0.5))。这句话是说我要在x: 0.7-1.2, y: 0 - 0.5画第二个图。实际上,只要认真观察这个下面代码就可以发现具体的关联。

我们画好了,我们要将这个画展示出来,那么我们拿着支架(fig)出来,吹一吹,就可以了:plt.show()

这个时候如果回过头看官网教程,可以发现,先画一个渐变图填充背景,然后使用for循环不断的区域对应的位置,这样就达到一个好的效果,为了让图更加好看,还对每一个imshow的数据要进行归一化,统一一下标准这样就达到柱状图好看的效果,

那么我们再随便写一下代码,看看效果如何:

import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() ax.set(xlim=(0,10), ylim=(0,1), autoscale_on=False) a = np.array([[1, 1], [2, 2]]) N = 10 x = np.arange(N) + 0.15 y = np.random.rand(N) width = 0.4 for x, y in zip(x, y): ax.imshow(a, interpolation='bicubic', extent=(x, x+width, 0, y), cmap=plt.cm.Blues_r) ax.set_aspect('auto') plt.show()

效果如下:

下面是官方代码,我觉得写的太复杂了。

有些人可能会对@ 这个符号疑惑,其实很简单:[a, b] @ [c, d] = a*c + b*d

不要被迷惑了。

代码如下:

import matplotlib.pyplot as plt import numpy as np np.random.seed(20200330) def gradient_image(ax, extent, direction=0.3, cmap_range=(0, 1), **kwargs): phi = direction * np.pi / 2 v = np.array([np.cos(phi), np.sin(phi)]) x = np.array([[v @ [1, 0], v @ [1, 1]], [v @ [0, 0], v @ [0, 1]]]) a, b = cmap_range x = a + (b - a) / x.max() * x im = ax.imshow(x, extent=extent, interpolation='bicubic', vmin=0, vmax=1, **kwargs) return im def gradient_bar(ax, x, y, width=0.5, bottom=0): for left, top in zip(x, y): right = left + width gradient_image(ax, extent=(left, right, bottom, top), cmap=plt.cm.Blues_r, cmap_range=(0, 0.8)) xmin, xmax = xlim = 0, 10 ymin, ymax = ylim = 0, 1 fig, ax = plt.subplots() ax.set(xlim=xlim, ylim=ylim, autoscale_on=False) # background image gradient_image(ax, direction=0, extent=(0, 1, 0, 1), transform=ax.transAxes, cmap=plt.cm.Oranges, cmap_range=(0.1, 0.6)) N = 10 x = np.arange(N) + 0.15 y = np.random.rand(N) gradient_bar(ax, x, y, width=0.7) ax.set_aspect('auto') plt.show()



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3