Python matplotlib:数据坐标中的位置颜色条

时间:2014-04-04 12:24:52

标签: python matplotlib colorbar

我想通过指定数据坐标中的位置将颜色条放在散点图中。 以下是指定图形坐标时的工作原理示例:

import numpy as np
import matplotlib.pyplot as plt    

#Generate some random data:
a = -2
b = 2
x = (b - a) * np.random.random(50) + a
y = (b - a) * np.random.random(50) + a
z = (b) * np.random.random(50)

#Do a scatter plot
fig = plt.figure()
hdl = plt.scatter(x,y,s=20,c=z,marker='o',vmin=0,vmax=2)
ax = plt.gca()
ax.set_xlim([-2,2])
ax.set_ylim([-2,2])

#Specifying figure coordinates works fine:
fig_coord = [0.2,0.8,0.25,0.05]
cbar_ax = fig.add_axes(fig_coord)

clevs = [0, 1 , 2]
cb1 = plt.colorbar(hdl, cax=cbar_ax, orientation='horizontal', ticks=clevs)

plt.show()

...好的,不能在这里包含情节图像,因为我缺乏声誉。但上面的代码会给你一个印象......

现在的问题是,如何将颜色条定位在数据坐标处,以便出现在例如: 左,底,宽,高:-1.5,1.5,1,2.25

我已经尝试了一些方法,比如确定图中的轴位置并将其转换为数据坐标但是没有成功。

非常感谢您的想法或指示我已经回答了类似的问题!

这是我做的(不是特别漂亮,但它有帮助)。谢谢tcaswell

#[lower left x, lower left y, upper right x, upper right y] of the desired colorbar:
dat_coord = [-1.5,1.5,-0.5,1.75]
#transform the two points from data coordinates to display coordinates:
tr1 = ax.transData.transform([(dat_coord[0],dat_coord[1]),(dat_coord[2],dat_coord[3])])
#create an inverse transversion from display to figure coordinates:
inv = fig.transFigure.inverted()
tr2 = inv.transform(tr1)
#left, bottom, width, height are obtained like this:
datco = [tr2[0,0], tr2[0,1], tr2[1,0]-tr2[0,0],tr2[1,1]-tr2[0,1]]
#and finally the new colorabar axes at the right position!
cbar_ax = fig.add_axes(datco)
#the rest stays the same:
clevs = [0, 1 , 2]
cb1 = plt.colorbar(hdl, cax=cbar_ax, orientation='horizontal', ticks=clevs)

plt.show()

2 个答案:

答案 0 :(得分:1)

指定轴的数据坐标中的位置的两步:

  1. 使用Axes.set_axes_locator()设置一个返回图形坐标中Bbox个对象的函数。
  2. set_clip_box()方法
  3. 设置轴中所有子项的剪辑框

    以下是完整代码:

    import numpy as np
    import matplotlib.pyplot as plt    
    
    #Generate some random data:
    a = -2
    b = 2
    x = (b - a) * np.random.random(50) + a
    y = (b - a) * np.random.random(50) + a
    z = (b) * np.random.random(50)
    
    #Do a scatter plot
    fig = plt.figure()
    hdl = plt.scatter(x,y,s=20,c=z,marker='o',vmin=0,vmax=2)
    ax = plt.gca()
    ax.set_xlim([-2,2])
    ax.set_ylim([-2,2])
    
    #Specifying figure coordinates works fine:
    fig_coord = [0.2,0.8,0.25,0.05]
    cbar_ax = fig.add_axes(fig_coord)
    
    def get_ax_loc(cbar_ax, render):
        from matplotlib.transforms import Bbox
        tr = ax.transData + fig.transFigure.inverted()
        bbox = Bbox(tr.transform([[1, -0.5], [1.8, 0]]))
        return bbox
    
    clevs = [0, 1 , 2]
    cb1 = plt.colorbar(hdl, cax=cbar_ax, orientation='horizontal', ticks=clevs)
    
    def get_ax_loc(cbar_ax, render):
        from matplotlib.transforms import Bbox
        tr = ax.transData + fig.transFigure.inverted()
        bbox = Bbox(tr.transform([[1, -0.5], [1.8, 0]]))
        return bbox
    
    def set_children_clip_box(artist, box):
        for c in artist.get_children():
            c.set_clip_box(box)
            set_children_clip_box(c, box)
    
    cbar_ax.set_axes_locator(get_ax_loc)
    set_children_clip_box(cbar_ax, hdl.get_clip_box())
    
    plt.show()
    

    这是输出:

    enter image description here

答案 1 :(得分:1)

根据对原始问题的评论,这是我的所作所为:

import numpy as np
import matplotlib.pyplot as plt    

a = -2
b = 2

x = (b - a) * np.random.random(50) + a
y = (b - a) * np.random.random(50) + a
z = (b) * np.random.random(50)

fig = plt.figure()
hdl = plt.scatter(x,y,s=20,c=z,marker='o',vmin=0,vmax=2)
ax = plt.gca()
ax.set_xlim([-2,2])
ax.set_ylim([-2,2])

#[(lower left x, lower left y), (upper right x, upper right y)] of the desired colorbar:
dat_coord = [(-1.5,1.5),(-0.5,1.75)]
#transform the two points from data coordinates to display coordinates:
tr1 = ax.transData.transform(dat_coord)
#create an inverse transversion from display to figure coordinates:
inv = fig.transFigure.inverted()
tr2 = inv.transform(tr1)
#left, bottom, width, height are obtained like this:
datco = [tr2[0,0], tr2[0,1], tr2[1,0]-tr2[0,0],tr2[1,1]-tr2[0,1]]
#and finally the new colorabar axes at the right position!
cbar_ax = fig.add_axes(datco)
#the rest stays the same:
clevs = [0, 1 , 2]
cb1 = plt.colorbar(hdl, cax=cbar_ax, orientation='horizontal', ticks=clevs)

plt.show()