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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 渐变填充柱状图内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

相关文档
最新文档