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


Posted in Python onDecember 10, 2020

目的

在各种各样的理论计算中,常常需要绘制各种填充图,绘制完后需要加渐变填充的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

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

效果2

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

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

Python 相关文章推荐
python使用socket远程连接错误处理方法
Apr 29 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
你应该知道的python列表去重方法
Jan 17 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
浅谈pytorch和Numpy的区别以及相互转换方法
Jul 26 Python
一百多行python代码实现抢票助手
Sep 25 Python
Python实现时间序列可视化的方法
Aug 06 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
django中的数据库迁移的实现
Mar 16 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 #Python
python 实现ping测试延迟的两种方法
Dec 10 #Python
弄清Pytorch显存的分配机制
Dec 10 #Python
python实现经纬度采样的示例代码
Dec 10 #Python
Python urlopen()参数代码示例解析
Dec 10 #Python
Python urllib request模块发送请求实现过程解析
Dec 10 #Python
Python APScheduler执行使用方法详解
Dec 10 #Python
You might like
Zend的MVC机制使用分析(一)
2013/05/02 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
Python contextlib模块使用示例
2015/02/18 Python
深入理解Python对Json的解析
2017/02/14 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
python实现剪切功能
2019/01/23 Python
Python实现Event回调机制的方法
2019/02/13 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
Python类的动态绑定实现原理
2020/03/21 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
销售员岗位职责范本
2014/02/03 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
公司年底活动方案
2014/08/17 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis