8

这是一个生成图的最小示例,该图说明了我的问题:

import matplotlib.pylab as plt
import matplotlib.mpl as mpl
import numpy as np
import random

data = [[random.random() for i in range(10)] for j in range(10)]

[XT, YT] = np.meshgrid(np.arange(1,10+1,1), np.arange(1,10+1,1))

cmap = mpl.cm.gray

fig, ax = plt.subplots()

CS = ax.contour(XT, YT, data,levels=np.arange(0,1+0.1,0.1),\
                cmap=cmap,linewidths=0.75)
CB = plt.colorbar(CS, ticks=np.arange(0,1+0.1,0.1))  

plt.show()

结果图如下所示:

gray_contours

我想将linewidths图中的等高线保留在,0.75但增加它们colorbar(为了更好的可读性)。

如何在不更改图linewidths中的colorbar情况下更改它们?

我最初尝试过CB.collections,但colorbar没有collections。此外,colorbar使用参数调用linewidths=4.0也不起作用(它是未知参数)。

评论
在输入这个问题时我有这个想法(橡皮鸭调试):

CS = ax.contour(XT, YT, data,levels=np.arange(0,1+0.1,0.1),\
            cmap=cmap,linewidths=4.0)
CB = plt.colorbar(CS, ticks=np.arange(0,1+0.1,0.1))
plt.setp(CS.collections , linewidth=0.75)

基本上,将初始设置linewidths为 所需的水平colorbar,然后生成 ,然后colorbarcollections原始轮廓线上使用以减小它们的线宽。
这行得通。

但是:有没有办法直接linewidths控制colorbar?

4

2 回答 2

4

您只需要了解如何访问这些行,让我们尝试:

>>> CB.ax.get_children()
[<matplotlib.axis.XAxis object at 0x026A74B0>, <matplotlib.axis.YAxis object at 0x026AF270>, <matplotlib.lines.Line2D object at 0x026AF190>, <matplotlib.patches.Polygon object at 0x027387F0>, <matplotlib.collections.LineCollection object at 0x02748BD0>, <matplotlib.text.Text object at 0x026C0D10>, <matplotlib.patches.Rectangle object at 0x026C0D50>, <matplotlib.spines.Spine object at 0x026A7410>, <matplotlib.spines.Spine object at 0x026A7290>, <matplotlib.spines.Spine object at 0x026A7350>, <matplotlib.spines.Spine object at 0x026A71B0>]

好吧,猜一猜,我敢打赌第 5 项是分隔线列表。我们正在寻找一些.line对象,有两个。第一个(第三项)实际上是整个颜色条的边缘(如果我没记错的话)。所以我会去找下一个.line对象。

现在让我们尝试通过几种方式对其进行修改:

>>> len(lines1[4].get_linewidths())
11 #how many item are there? 11 lines
>>> lines1[4].set_color(['r']*11) #set them all to red, in this example we actually want to have the color stay the same, this is just for a demonstration. 
>>> lines1[4].set_linewidths([2]*11) #set them all to have linewidth of 2.

结果在此处输入图像描述

于 2013-10-15T03:02:38.457 回答
0

使用Axes.tick_params. 当您CB用作颜色栏的句柄时,颜色栏中的线宽可以通过以下方式设置:

CB.ax.tick_params(size = your_size, width = your_width)

size是颜色栏中刻度线的长度。width是线宽。

于 2018-12-10T12:25:39.587 回答