Python利用imshow制作自定义渐变填充柱状图(colorbar)

目的

在各种各样的理论计算中,常常需要绘制各种填充图,绘制完后需要加渐变填充的colorbar。可是有些软件如VMD,colorbar渲染后颜色分布有些失真,不能较准确的表达各颜色对应的数值。用ps中的渐变填充可以解决该问题,但很多电脑配置较低,不能很好的运行ps。Python也可以直接绘制colorbar,填充颜色就好。如cmap中的bwr渐变本人就比较常用。然而,有时候颜色范围是负数范围多于正数范围(如:colorbar需要表示 [-60,40]这段,蓝色表示负数,红色表示正数,白色应该在colorbar由下往上60%处),bwr渐变将white置于50%处显得不够合理,因此需要自定义填充。本文以imshow() 函数来进行填充柱状图达到自定义colorbar的目的。interpolation=‘bicubic' 可以很好的做出渐变效果。

代码

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 9 10:36:54 2020

@author: fya
"""

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap,LinearSegmentedColormap
import matplotlib as mpl

fig, ax = plt.subplots(dpi=96)
ax.set(xlim=(1,10), ylim=(-0.1,101), autoscale_on=False) #创建图像范围

a = np.array([[1, 1],
       [2, 2],
       [3, 3],
       [4, 4],
       [5, 5]]) #每种渐变色分成五段(array五行),数字表示在colormap对应的深浅
print(a.shape)

clist=['white','blue'] #线性变化颜色由上面array值 小到大,越小,越白,达到上白下蓝的渐变效果
clist2=['red','white'] #渐变色2,用于白色到红色填充,array越小,越红,达到上红下白的效果
newcmp = LinearSegmentedColormap.from_list('chaos',clist)
newcmp2 = LinearSegmentedColormap.from_list('chaos',clist2)

plt.imshow(a,cmap=newcmp,interpolation='bicubic',extent=(1,10,0,60))#60%都是蓝色到白色渐变
plt.imshow(a,cmap=newcmp2,interpolation='bicubic',extent=(1,10,60,100)) #白色设置在60%处

frame = plt.gca() #读取当前图层
ax.yaxis.tick_right() #纵坐标移到右边
ax.set_yticklabels(('-80','-60','-40','-20','0','20','40')) #自定义yticks显示的值,第一个label不显示
frame.spines['top'].set_visible(False) #上框线不显示
frame.spines['bottom'].set_visible(False)
frame.spines['right'].set_visible(False)
frame.spines['left'].set_visible(False)
plt.xticks([]) #x坐标不要

plt.show()
fig.savefig('colorbar.tif',dpi=600,format='tif')
print('Done!')

#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()

代码2,渐变色分100段

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 9 10:36:54 2020

@author: fanyiang
"""

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap,LinearSegmentedColormap
import matplotlib as mpl
import pandas as pd
import os

fig, ax = plt.subplots(dpi=96)
ax.set(xlim=(1,10), ylim=(-0.1,101), autoscale_on=False)

#a = np.array([[1, 1],
       #[2, 2],
       #[3, 3],
       #[4, 4],
       #[5, 5]]) #每种渐变色分成五段(array五行),数字表示在colormap对应的深浅
avalue=locals()
dfvalue=locals()
for i in range(1,101):
  avalue['a'+str(i)]=np.array([[i,i]]) #渐变色分为100段,分的更细
  dfvalue['df'+str(i)]=pd.DataFrame(avalue['a'+str(i)]) #转dataframe
  df=dfvalue['df'+str(i)]
  df.to_csv("temp.csv", mode='a',header=None) #暂存csv文件,第一列会把每一次循环的index放进去
df3=pd.read_csv('temp.csv',header=None)#读取csv
df3.columns=['序号','x','y']#column命名,第一列废弃
df3=df3.drop('序号',axis=1)#删除第一列
a=np.array(df3) #转array
print(df3.head())

#a=np.vstack((a1,a2,a3,a4,a5,a6,a7,a8,a9,a10))

print(a)

clist=['white','blue'] #线性变化颜色由上面array值 小到大
clist2=['red','white']
newcmp = LinearSegmentedColormap.from_list('chaos',clist)
newcmp2 = LinearSegmentedColormap.from_list('chaos',clist2)

plt.imshow(a,cmap=newcmp,interpolation='bicubic',extent=(1,10,0,60))
plt.imshow(a,cmap=newcmp2,interpolation='bicubic',extent=(1,10,60,100)) #白色设置在60%处

frame = plt.gca() #读取当前图层
ax.yaxis.tick_right() #纵坐标移到右边
ax.set_yticklabels(('-80','-60','-40','-20','0','20','40')) #自定义yticks显示的值,第一个label不显示
frame.spines['top'].set_visible(False) #上框线不显示
frame.spines['bottom'].set_visible(False)
frame.spines['right'].set_visible(False)
frame.spines['left'].set_visible(False)
plt.xticks([]) #x坐标不要

plt.show()
fig.savefig('colorbar.tif',dpi=600,format='tif')
os.remove("temp.csv") #删除临时的csv文件
print('Done!')

#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()

效果

效果1

效果2

到此这篇关于Python利用imshow制作自定义渐变填充柱状图(colorbar)的文章就介绍到这了,更多相关Python 渐变填充柱状图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3+PyQt5实现柱状图

    本文通过Python3+pyqt5实现了python Qt GUI 快速编程的16章的excise例子. #!/usr/bin/env python3 import random import sys from PyQt5.QtCore import (QAbstractListModel, QAbstractTableModel, QModelIndex, QSize, QTimer, QVariant, Qt,pyqtSignal) from PyQt5.QtWidgets import (

  • Python实现绘制双柱状图并显示数值功能示例

    本文实例讲述了Python实现绘制双柱状图并显示数值功能.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 import matplotlib.pyplot as plt import mpl_toolkits.mplot3d #定义函数来显示柱状上的数值 def autolabel(rects): for rect in rects: height = rect.get_height() plt.text(rect.get_x()+rect.

  • Python画图实现同一结点多个柱状图的示例

    如下所示: import numpy as np x = [1,2] #横坐标 y = [3,4] #第一个纵坐标 y1 = [5,6] #第二个纵坐标 x = np.arange(len(x)) #首先用第一个的长度作为横坐标 width = 0.05 #设置柱与柱之间的宽度 fig,ax = plt.subplots() ax.bar(x,y,width,alpha = 0.9) ax.bar(x+width,y1,width,alpha = 0.9,color= 'red') ax.set

  • Python 堆叠柱状图绘制方法

    本文介绍了Python 堆叠柱状图绘制方法,分享给大家,具体如下: ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' >>文件: 堆叠直方图.py >>作者: liu yang >>邮箱: liuyang0001@outlook.com >>博客: www.cnblogs.com/liu66blog '''''

  • python使用matplotlib绘制柱状图教程

    Matplotlib的概念这里就不多介绍了,关于绘图库Matplotlib的安装方法:点击这里 小编之前也和大家分享过python使用matplotlib实现的折线图和制饼图效果,感兴趣的朋友们也可以点击查看,下面来看看python使用matplotlib绘制柱状图的方法吧,具体如下: 1. 基本的柱状图 import matplotlib.pyplot as plt data = [5, 20, 15, 25, 10] plt.bar(range(len(data)), data) plt.s

  • Python绘制堆叠柱状图的实例

    有个朋友要求帮忙绘制堆叠柱状图,查阅了一些文档之后也算是完成了,只是一个小demo,下面我就记录一下. 1.什么是堆叠柱状图 与并排显示分类的分组柱状图不同,堆叠柱状图将每个柱子进行分割以显示相同类型下各个数据的大小情况.它可以形象的展示一个大分类包含的每个小分类的数据,以及各个小分类的占比,显示的是单个项目与整体之间的关系.效果图如下: 2.数据展示 这里展示了部分数据,主要是treatment就是对应的上图分类一,分类二:species就是对应的分组:ra就是对应的各个分组的比例. 3.Py

  • Python利用imshow制作自定义渐变填充柱状图(colorbar)

    目的 在各种各样的理论计算中,常常需要绘制各种填充图,绘制完后需要加渐变填充的colorbar.可是有些软件如VMD,colorbar渲染后颜色分布有些失真,不能较准确的表达各颜色对应的数值.用ps中的渐变填充可以解决该问题,但很多电脑配置较低,不能很好的运行ps.Python也可以直接绘制colorbar,填充颜色就好.如cmap中的bwr渐变本人就比较常用.然而,有时候颜色范围是负数范围多于正数范围(如:colorbar需要表示 [-60,40]这段,蓝色表示负数,红色表示正数,白色应该在c

  • Python利用PaddleOCR制作个搜题小工具

    目录 介绍 安装 安装PaddlePaddle飞桨框架 安装PaddleOCR 代码使用 搜题小工具 安装ADB 截图并保存题目区域图片 OCR识别,获取题目 打开浏览器搜索 完整代码 介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. 本教程将介绍PaddleOCR的基本使用方法以及如何使用它开发一个自动搜题的小工具. 项目地址 OR 安装 虽然

  • Python利用PyQt5制作一个获取网络实时NBA数据并播报的GUI程序

    制作NBA数据爬虫 捋顺思路 我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据 我们点击进去后,可以发现这是一个非常简洁的网址 我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2Bi

  • Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI功能

    制作NBA数据爬虫 捋顺思路 我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据 我们点击进去后,可以发现这是一个非常简洁的网址 我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2Bi

  • python利用elaphe制作二维条形码实现代码

    手机上的二维码识别程序已经做的很好了,"我查查"用起来很不错的 我搜集了几个二维条码生成网站: http://www.morovia.com/free-online-barcode-generator/qrcode-maker.php http://qrencode.sinaapp.com/ http://www.mayacode.com/ 作为一个程序猿,我们也要懂得如何制作二维条形码 python的elaphe模块帮我们解决了问题 复制代码 代码如下: from elaphe im

  • Python利用matplotlib实现制作动态条形图

    目录 制作思路 animation 大家好,本文将分享如何使用matplotlib制作动态条形图,制作的图很美,这个是我在之前发布的一篇中使用的图片, 效果如下 制作思路 为了方便大家学习,我将不直接进行讲解,而是以我是如何一步步制作的思路来介绍整个过程. 说到用 Python 制作动态图,首先想到的肯定是一些直接拿来就用的库,虽然我没做过,但是我相信一定有且不止一个,搜了一圈后发现有个bar chart race库看起来不错 毕竟有现成的轮子,只需要填充数据即可,但是研究了一番,正如我之前所说

  • Python利用reportlab实现制作pdf报告

    目录 前言 reportlab是什么 安装和导入库 将画图.画表格.编辑文字抽象为类 pdf插入图片 以文件路径写入pdf 以流文件写入pdf pdf分页 以生成pdf流文件为例 前言 本博客重点内容:reportlab生成流文件格式.reportlab分页和图片流文件写入reportlab等. 我讲一下我这个需求的来源,做的项目是一个地理空间查询和使用的系统,通过在前端调用高德地图api创建了一个查询区域,获取区域内的地理数据(数据库).具体的需求就是,将查询区域和地理数据制作成一个覆盖率分析

  • python 制作自定义包并安装到系统目录的方法

    python 中的包的概念跟c++中的namespace很相似,在大型的工程开发中,多个开发人员很容使用相同的函数名,为了避免相同函数名带来的问题,就引入了包的概念. 在看别人写的程序中经常看到形如"from xx import yy"xx就是包 制作一个本地使用的包 建立一个文件夹并命名为dl,文件夹名"dl"就是我们的包名,在文件夹内部新建一个"__init__.py"(注意init左右两边都是两个底线符号),在文件夹下添加自己的模块即可,代

  • Python中利用pyqt5制作指针钟表显示实时时间(指针时钟)

    文末附完整源代码实现过程... 想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现.说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPainter组件也是可以实现的.而且最后呈现出来的效果还是挺漂亮的. 实现思路:通过使用pyqt5的QPainter组件来绘制好时钟的图表,最后通过定时器不断的改变当前当前时间在图表上面的显示位置.这样最终就实现了一个指针时钟在不断的走动的过程. 和前面的UI应用一样,我们用到的UI相关的组件

  • 利用Python为女神制作一个专属网站

    目录 数据准备 网站搭建 服务部署 先来看一下效果吧,只要有足够的照片素材,捕获女神的心就指日可待 怎么样,看起来还可以吧 下面就一起来完成吧 数据准备 首先是测试图片的获取,毕竟萝卜哥当前还没有那么多女神的照片 这里我使用如下网站的高清图片,嗯,各个都是大美女 抓取的代码比较简单 import requests import json def get_pic():     headers = {"Accept": "application/json, text/javasc

随机推荐