修正matplotlib散点图中的颜色

29 投票
2 回答
61570 浏览
提问于 2025-04-15 23:16

我想在多个散点图上固定颜色范围,并在每个图上添加一个颜色条(每个图上的颜色条都是一样的)。简单来说,我想把坐标轴和颜色空间等各个方面都固定好,这样这些图就可以直接通过肉眼进行比较。

可是,我怎么也搞不清楚怎么固定颜色范围。我试过用vmin和vmax,但似乎没什么效果,我也试过clim(x,y),但那也不行。

这肯定是个常见的问题,我不可能是唯一一个想在图之间比较不同数据子集的人……那么,怎么才能固定颜色,让每个数据在不同的图中保持相同的颜色,而不是因为子集的最大值和最小值变化而被重新映射成不同的颜色呢?

2 个回答

0

好吧,这其实不是一个答案,而是一个后续更新。我对汤姆的代码做了一些修改,下面是我的结果。[我不太确定是否要去掉答案的勾选,因为上面的代码确实有效,并且回答了问题!]

不过,这似乎对我的数据不太管用!!下面是可以用我的数据生成图表的修改代码,之前因为某种奇怪的原因没能成功。输入数据是通过h5py函数导入的(hdf5数据文件)。

在下面的代码中,rf85是大批实验中一个子集,RF功率大约是85瓦特。我基本上是在以不同的方式切分和处理数据,试图找出一些趋势。这是85瓦特的数据,和当前输入的完整数据集相比(还有更多数据,但这是我现在能用的)。

import numpy
import matplotlib.pyplot as plt

CurrentsArray = [array([ 0.83333333,  0.8       ,  0.57142857,  0.83333333,  1.03333333,
        0.25      ,  0.81666667,  0.35714286,  0.26      ,  0.57142857,
        0.83333333,  0.47368421,  0.80645161,  0.47368421,  0.52631579,
        0.36666667,  0.47368421,  0.57142857,  0.47368421,  0.47368421,
        0.47368421,  0.47368421,  0.47368421,  0.61764706,  0.81081081,
        0.41666667,  0.47368421,  0.47368421,  0.45      ,  0.73333333,
        0.8       ,  0.8       ,  0.8       ,  0.47368421,  0.45      ,
        0.47368421,  0.83333333,  0.47368421,  0.22222222,  0.32894737,
        0.57142857,  0.83333333,  0.83333333,  1.        ,  1.        ,
        0.46666667])]

growthTarray = [array([ 705.,  620.,  705.,  725.,  712.,  705.,  680.,  680.,  620.,
        660.,  660.,  740.,  721.,  730.,  720.,  720.,  730.,  705.,
        690.,  705.,  680.,  715.,  705.,  670.,  705.,  705.,  650.,
        725.,  725.,  650.,  650.,  650.,  714.,  740.,  710.,  717.,
        737.,  740.,  660.,  705.,  725.,  650.,  710.,  703.,  700.,  650.])]

CuSearray = [array([ 0.46395015,  0.30287259,  0.43496888,  0.46931773,  0.47685844,
        0.44894925,  0.50727844,  0.45076198,  0.44977095,  0.41455029,
        0.38089693,  0.98174953,  0.48600461,  0.65466528,  0.40563053,
        0.22990327,  0.54372179,  0.43143358,  0.92515847,  0.73701742,
        0.64152173,  0.52708783,  0.51794063,  0.49      ,  0.48878252,
        0.45119732,  0.2190089 ,  0.43470776,  0.43509758,  0.52697697,
        0.21576805,  0.32913721,  0.48828072,  0.62201997,  0.71442359,
        0.55454867,  0.50981136,  0.48212956,  0.46      ,  0.45732419,
        0.43402525,  0.40290777,  0.38594786,  0.36777306,  0.36517926,
        0.29880924])]

PFarray = [array([ 384.,  285.,  280.,  274.,  185.,  185.,  184.,  184.,  184.,
        184.,  184.,  181.,  110.,  100.,  100.,  100.,   85.,   85.,
         84.,   84.,   84.,   84.,   84.,   84.,   84.,   84.,   84.,
         84.,   84.,   84.,   84.,   84.,   27.,   20.,    5.,    5.,
          1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.])]

rf85growthTarray = [array([ 730.,  705.,  690.,  705.,  680.,  715.,  705.,  670.,  705.,
        705.,  650.,  725.,  725.,  650.,  650.,  650.])]

rf85CuSearray = [array([ 0.54372179,  0.43143358,  0.92515847,  0.73701742,  0.64152173,
        0.52708783,  0.51794063,  0.49      ,  0.48878252,  0.45119732,
        0.2190089 ,  0.43470776,  0.43509758,  0.52697697,  0.21576805,
        0.32913721])]

rf85PFarray = [array([ 85.,  85.,  84.,  84.,  84.,  84.,  84.,  84.,  84.,  84.,  84.,
        84.,  84.,  84.,  84.,  84.])]

rf85CurrentsArray = [array([ 0.54372179,  0.43143358,  0.92515847,  0.73701742,  0.64152173,
        0.52708783,  0.51794063,  0.49      ,  0.48878252,  0.45119732,
        0.2190089 ,  0.43470776,  0.43509758,  0.52697697,  0.21576805,
        0.32913721])]

Datavmax = max(max(CurrentsArray))
Datavmin = min(min(CurrentsArray))

plt.subplot(121)
plt.scatter(growthTarray, CuSearray, PFarray, CurrentsArray, vmin=Datavmin, vmax=Datavmax, alpha=0.75)
plt.colorbar()
plt.xlim(600,760)
plt.ylim(0,2.5)

plt.subplot(122)
plt.scatter(rf85growthTarray, rf85CuSearray, rf85PFarray, rf85CurrentsArray, vmin=Datavmin, vmax=Datavmax, alpha=0.75)
plt.colorbar()
plt.xlim(600,760)
plt.ylim(0,2.5)

plt.show()

最后,输出结果:

colorfailed!

请注意,这并不是我工作的完美输出,但我没有花太多精力去做到完美。不过,有一点很重要:你会发现图表中相同的数据点并没有显示相同的颜色,这应该是根据上面使用的vmin和vmax来决定的(正如汤姆的代码所建议的那样)。

这真让人抓狂。 :( 我希望有人能帮我解答这个问题!我相信我的代码并不太好,所以请不要担心会冒犯到我!!

如果有人能建议我一个解决办法,我会额外奖励一包火辣辣的切托斯。 -艾伦

更新- Tom10发现了问题 - 我不小心用了错误的数据作为我的一个子数组,导致值显示的颜色级别和预期不符(也就是说,我的数据是错的!)非常感谢汤姆!我希望能再给他一个赞,但由于我提问的方式,我不能(抱歉,汤姆!)

请大家也看看他在下面提到的数据位置绘制文本的精彩示例。

这里有一张更新的图片,显示汤姆的方法确实有效,而绘图的问题出在我自己的代码上: alt text

54

设置 vmin 和 vmax 应该可以做到这一点。

这里有一个例子:

import matplotlib.pyplot as plt

xyc = range(20)

plt.subplot(121)
plt.scatter(xyc[:13], xyc[:13], c=xyc[:13], s=35, vmin=0, vmax=20)
plt.colorbar()
plt.xlim(0, 20)
plt.ylim(0, 20)

plt.subplot(122)
plt.scatter(xyc[8:20], xyc[8:20], c=xyc[8:20], s=35, vmin=0, vmax=20)   
plt.colorbar()
plt.xlim(0, 20)
plt.ylim(0, 20)

plt.show()

这个例子生成的图像如下:

alt text

撰写回答