这是我的示例代码。在这里,我需要将颜色条更改为可拖动的颜色条,并向颜色条添加列表颜色。我在google中尝试了很多示例,但没有得到正确的输出。有人可以帮助我如何添加更多自定义的颜色和颜色栏就像可拖动的一样。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import gaussian_filter
import pandas as pd
from matplotlib.ticker import FormatStrFormatter
import os
import matplotlib.colors
class DraggableColorbar(object):
def __init__(self, cbar, mappable):
self.cbar = cbar
self.mappable = mappable
self.press = None
self.cycle = sorted([i for i in dir(plt.cm) if hasattr(getattr(plt.cm,i),'N')])
self.index = self.cycle.index(cbar.get_cmap().name)
def connect(self):
"""connect to all the events we need"""
self.cidpress = self.cbar.patch.figure.canvas.mpl_connect(
'button_press_event', self.on_press)
self.cidrelease = self.cbar.patch.figure.canvas.mpl_connect(
'button_release_event', self.on_release)
self.cidmotion = self.cbar.patch.figure.canvas.mpl_connect(
'motion_notify_event', self.on_motion)
self.keypress = self.cbar.patch.figure.canvas.mpl_connect(
'key_press_event', self.key_press)
self.cidscroll = self.cbar.patch.figure.canvas.mpl_connect(
'scroll_event', self.scrolled)
def scrolled(self):
pass
def on_press(self, event):
"""on button press we will see if the mouse is over us and store some data"""
if event.inaxes != self.cbar.ax: return
self.press = event.x, event.y
def key_press(self, event):
if event.key=='down':
self.index += 1
elif event.key=='up':
self.index -= 1
if self.index<0:
self.index = len(self.cycle)
elif self.index>=len(self.cycle):
self.index = 0
cmap = self.cycle[self.index]
self.cbar.set_cmap(cmap)
self.cbar.draw_all()
self.mappable.set_cmap(cmap)
self.mappable.get_axes().set_title(cmap)
self.cbar.patch.figure.canvas.draw()
def on_motion(self, event):
'on motion we will move the rect if the mouse is over us'
if self.press is None: return
if event.inaxes != self.cbar.ax: return
xprev, yprev = self.press
dx = event.x - xprev
dy = event.y - yprev
self.press = event.x,event.y
scale = self.cbar.norm.vmax - self.cbar.norm.vmin
perc = 0.03
if event.button==1:
self.cbar.norm.vmin -= (perc*scale)*np.sign(dy)
self.cbar.norm.vmax -= (perc*scale)*np.sign(dy)
elif event.button==3:
self.cbar.norm.vmin -= (perc*scale)*np.sign(dy)
self.cbar.norm.vmax += (perc*scale)*np.sign(dy)
self.cbar.draw_all()
self.mappable.set_norm(self.cbar.norm)
self.cbar.patch.figure.canvas.draw()
def on_release(self, event):
"""on release we reset the press data"""
self.press = None
self.mappable.set_norm(self.cbar.norm)
self.cbar.patch.figure.canvas.draw()
def disconnect(self):
"""disconnect all the stored connection ids"""
self.cbar.patch.figure.canvas.mpl_disconnect(self.cidpress)
self.cbar.patch.figure.canvas.mpl_disconnect(self.cidrelease)
fileName = os.getcwd()
data = pd.read_csv(fileName+'/ps.csv', names = ['x','y','z','colour'])
var = data.y.unique()
var = sorted(var)
totalSquares = len(var)
data1 = data[data.y==var[1]]
plot = plt.tricontourf(data1.x,data1.z,data1.colour,100)
ax = plt.gca() # get the axis
ax.set_ylim(ax.get_ylim()[::-1]) # invert the axis
ax.xaxis.tick_top() # and move the X-Axis
ax.yaxis.tick_left()
ax.xaxis.set_major_formatter(FormatStrFormatter('%d m'))
ax.yaxis.set_major_formatter(FormatStrFormatter('%d m'))
cbar = plt.colorbar(format='%05.2f')
cbar = DraggableColorbar(cbar,plot)
cbar.connect()
plt.show()
这是示例彩条图片