服务器之家

服务器之家 > 正文

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

时间:2021-08-12 00:17     来源/作者:晚亭听铃

目的

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

代码

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Dec 9 10:36:54 2020
  4.  
  5. @author: fya
  6. """
  7.  
  8. import matplotlib.pyplot as plt
  9. import numpy as np
  10. from matplotlib.colors import ListedColormap,LinearSegmentedColormap
  11. import matplotlib as mpl
  12.  
  13. fig, ax = plt.subplots(dpi=96)
  14. ax.set(xlim=(1,10), ylim=(-0.1,101), autoscale_on=False) #创建图像范围
  15.  
  16. a = np.array([[1, 1],
  17. [2, 2],
  18. [3, 3],
  19. [4, 4],
  20. [5, 5]]) #每种渐变色分成五段(array五行),数字表示在colormap对应的深浅
  21. print(a.shape)
  22.  
  23. clist=['white','blue'] #线性变化颜色由上面array值 小到大,越小,越白,达到上白下蓝的渐变效果
  24. clist2=['red','white'] #渐变色2,用于白色到红色填充,array越小,越红,达到上红下白的效果
  25. newcmp = LinearSegmentedColormap.from_list('chaos',clist)
  26. newcmp2 = LinearSegmentedColormap.from_list('chaos',clist2)
  27.  
  28. plt.imshow(a,cmap=newcmp,interpolation='bicubic',extent=(1,10,0,60))#60%都是蓝色到白色渐变
  29. plt.imshow(a,cmap=newcmp2,interpolation='bicubic',extent=(1,10,60,100)) #白色设置在60%处
  30.  
  31. frame = plt.gca() #读取当前图层
  32. ax.yaxis.tick_right() #纵坐标移到右边
  33. ax.set_yticklabels(('-80','-60','-40','-20','0','20','40')) #自定义yticks显示的值,第一个label不显示
  34. frame.spines['top'].set_visible(False) #上框线不显示
  35. frame.spines['bottom'].set_visible(False)
  36. frame.spines['right'].set_visible(False)
  37. frame.spines['left'].set_visible(False)
  38. plt.xticks([]) #x坐标不要
  39.  
  40. plt.show()
  41. fig.savefig('colorbar.tif',dpi=600,format='tif')
  42. print('Done!')
  43.  
  44. #N = 10
  45. #x = np.arange(N) + 0.15
  46. #y = np.random.rand(N)
  47.  
  48. #width = 0.4
  49. #for x, y in zip(x, y):
  50. #ax.imshow(a, interpolation='bicubic', extent=(x, x+width, 0, y), cmap=plt.cm.Blues_r)
  51.  
  52. #ax.set_aspect('auto')
  53. #plt.show()

代码2,渐变色分100段

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Dec 9 10:36:54 2020
  4.  
  5. @author: fanyiang
  6. """
  7.  
  8. import matplotlib.pyplot as plt
  9. import numpy as np
  10. from matplotlib.colors import ListedColormap,LinearSegmentedColormap
  11. import matplotlib as mpl
  12. import pandas as pd
  13. import os
  14.  
  15. fig, ax = plt.subplots(dpi=96)
  16. ax.set(xlim=(1,10), ylim=(-0.1,101), autoscale_on=False)
  17.  
  18. #a = np.array([[1, 1],
  19. #[2, 2],
  20. #[3, 3],
  21. #[4, 4],
  22. #[5, 5]]) #每种渐变色分成五段(array五行),数字表示在colormap对应的深浅
  23. avalue=locals()
  24. dfvalue=locals()
  25. for i in range(1,101):
  26. avalue['a'+str(i)]=np.array([[i,i]]) #渐变色分为100段,分的更细
  27. dfvalue['df'+str(i)]=pd.DataFrame(avalue['a'+str(i)]) #转dataframe
  28. df=dfvalue['df'+str(i)]
  29. df.to_csv("temp.csv", mode='a',header=None) #暂存csv文件,第一列会把每一次循环的index放进去
  30. df3=pd.read_csv('temp.csv',header=None)#读取csv
  31. df3.columns=['序号','x','y']#column命名,第一列废弃
  32. df3=df3.drop('序号',axis=1)#删除第一列
  33. a=np.array(df3) #转array
  34. print(df3.head())
  35.  
  36. #a=np.vstack((a1,a2,a3,a4,a5,a6,a7,a8,a9,a10))
  37.  
  38. print(a)
  39.  
  40. clist=['white','blue'] #线性变化颜色由上面array值 小到大
  41. clist2=['red','white']
  42. newcmp = LinearSegmentedColormap.from_list('chaos',clist)
  43. newcmp2 = LinearSegmentedColormap.from_list('chaos',clist2)
  44.  
  45. plt.imshow(a,cmap=newcmp,interpolation='bicubic',extent=(1,10,0,60))
  46. plt.imshow(a,cmap=newcmp2,interpolation='bicubic',extent=(1,10,60,100)) #白色设置在60%处
  47.  
  48. frame = plt.gca() #读取当前图层
  49. ax.yaxis.tick_right() #纵坐标移到右边
  50. ax.set_yticklabels(('-80','-60','-40','-20','0','20','40')) #自定义yticks显示的值,第一个label不显示
  51. frame.spines['top'].set_visible(False) #上框线不显示
  52. frame.spines['bottom'].set_visible(False)
  53. frame.spines['right'].set_visible(False)
  54. frame.spines['left'].set_visible(False)
  55. plt.xticks([]) #x坐标不要
  56.  
  57. plt.show()
  58. fig.savefig('colorbar.tif',dpi=600,format='tif')
  59. os.remove("temp.csv") #删除临时的csv文件
  60. print('Done!')
  61.  
  62. #N = 10
  63. #x = np.arange(N) + 0.15
  64. #y = np.random.rand(N)
  65.  
  66. #width = 0.4
  67. #for x, y in zip(x, y):
  68. #ax.imshow(a, interpolation='bicubic', extent=(x, x+width, 0, y), cmap=plt.cm.Blues_r)
  69.  
  70. #ax.set_aspect('auto')
  71. #plt.show()

效果

效果1

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

效果2

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

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

原文链接:https://blog.csdn.net/kelvinfanyiang/article/details/110920391

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部