修复matplotlib中散点图中的颜色
Posted
技术标签:
【中文标题】修复matplotlib中散点图中的颜色【英文标题】:Fixing color in scatter plots in matplotlib 【发布时间】:2011-02-24 22:20:18 【问题描述】:我想修复多个散点图上的颜色范围,并在每个图上添加一个颜色条(在每个图中都是相同的)。本质上,我正在修复轴和色彩空间等的所有方面,以便这些图可以直接通过肉眼进行比较。
对于我的一生,我似乎无法弄清楚固定颜色范围的所有各种方法。我试过vmin,vmax,但它似乎没有任何作用,我也尝试过clim(x,y),它似乎也不起作用。
这一定会出现在这里和那里,我不能是唯一一个想要比较绘图之间的各种数据子集的人......那么,你如何修复颜色以便每个数据在绘图之间保持它的颜色和由于子集 -v- 整个集合的最大/最小值的变化,不会重新映射到不同的颜色?
【问题讨论】:
【参考方案1】:设置 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()
由此产生的情节:
【讨论】:
嗨,汤姆!是的!这正是我想要的类型。但是,您确实使用了子图,而不是两个单独的图像,这可能是我的失败。我正要尝试使用一个非常大的 6-up 绘图页面作为示例(确实遵循此规则)的子图。我想知道 vmin/vmax 是否在单独的图片中损坏?我将使用您的示例并在今晚或明天对其进行测试,然后返回我的结果!当我最有可能返回时,我会给你一个复选标记! :) 感谢您发布回复! 24 小时内在这里见。干杯!!!! (先生,给你额外的山露!) 刚刚浏览了这个例子——喜欢它——同时向我解释了一些事情。有趣的是,子图与它下面的所有 plt.* 相关联。我一直在使用手柄。我现在将更改单个图的示例。 :) 好的!使用上面的简单示例,并简单地分别绘制每个图形(我是如何使用我的数据集的),颜色被保留了!也很高兴!哈哈。所以,也许是我在分散命令下使用了错误栏......但是,我会调查。你已经向我证明它有效! :) 谢谢,汤姆! 好吧,在我目前的实现中,它不起作用!大声笑我在下面的帖子中添加了一个带有非工作代码的答案,当我让它工作时会添加另一个答案。如果你没有发布,汤姆,我不会认为它有效,所以谢谢你这样做!【参考方案2】:好的,这并不是真正的答案,而是后续行动。我的编码结果改变了上面汤姆的代码。 [不确定我是否要删除答案复选标记,因为上面的代码确实有效,并且是问题的答案!]
它似乎不适用于我的数据!!下面是修改后的代码,可以与我的数据一起使用以生成一个由于某种奇怪原因而对我不起作用的图。输入来自 h5py 函数(hdf5 数据文件导入)。
在下面,rf85 是用于大批量实验的阵列子集,其中应用于系统的射频功率大约为 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()
最后是输出:
请注意,这不是我工作的完美输出,但我没有花费精力使其完美。然而重要的是:您将在绘图之间识别为相同的数据点不包含相同的颜色,这应该是基于上面使用的 vmin vmax 的情况(正如 Tom 的代码所建议的那样)。 p>
这太疯狂了。 :( 我确实希望有人能为我阐明这一点!我很肯定我的代码不是那么好,所以当涉及到我的代码时,请不要担心冒犯!
给任何能提出前进方向的人额外的一袋火辣奇多。 -艾伦
更新 - Tom10 发现了问题 - 我无意中为我的一个子阵列使用了错误的数据,导致这些值给出的颜色级别与预期不同(即,我的数据是错误的!)为此给汤姆大支持-我希望我能再给他一个赞成票,但由于我提出这个问题的方法,我不能(对不起汤姆!)
另请参阅他在下面提到的数据位置绘制文本的精彩示例。
这是一个更新的图像,显示 Tom 的方法确实有效,并且绘图是我自己的代码中的一个问题:
【讨论】:
这是因为您的颜色值在每个图中都不同(即 CurrentsArray 和 rf85CurrentsArray 在相同的 x 和 y 坐标处具有不同的值)。例如,y 轴上 1.0 附近的小点在第一个图中的颜色值为 0.47368421,在第二个图中为 0.92515847。您可以看到这是您使用 plt.text(x, y, val) 在每个点旁边写入值。 顺便说一句,我认为最好将其作为一个单独的问题提出,而不是将第二个问题作为答案发布。在这里我需要在有各种限制的评论中回答 - 没有代码,没有数字,没有格式等。也就是说,你的第一个问题是“如何使用相同的色标”,你的第二个问题更多“我的代码有什么问题”。 啊!谢谢你的指点,汤姆!我是***的新手,所以我正在慢慢想办法。 :)。我很感激!我一定会仔细看价值观!他们不应该不同!如果是这样,我制作它们的工作有问题!谢谢! 也许你刚刚弄混了一些小东西。在这里,rf85CuSearray 和 rf85CurrentsArray 完全一样,看起来很奇怪。 Tom-你说得对-我经常在matlab中重用sn-ps代码,因为它们可以在向上箭头缓冲区中轻松使用-我想我错过了一些改变!你在这里一针见血。谢谢你们所有的cmets-我从你们身上学到了很多!!我喜欢 plt.text 小技巧! :) 我的帽子给你了,汤姆!感谢您花在这方面的时间!以上是关于修复matplotlib中散点图中的颜色的主要内容,如果未能解决你的问题,请参考以下文章
使用 matplotlib 的 x-y 散点图中误差线的颜色图