如何使用matplotlib创建定制的颜色条

时间:2018-11-20 10:05:02

标签: python-2.7 matplotlib colorbar

这是我的示例代码。在这里,我需要将颜色条更改为可拖动的颜色条,并向颜色条添加列表颜色。我在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()

这是示例彩条图片

enter image description here

0 个答案:

没有答案