关于plt.scatter()的使用
Posted 恶熊比比
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于plt.scatter()的使用相关的知识,希望对你有一定的参考价值。
1.plt.scatter()的说明
- 来源: plt.scatter()是来源于matplotlib库中pyplot子库的一个方法
pyplot是matplotlib子库,用于绘制2D图表 - 参数: pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)
- 作用: plt.scatter()函数用于生成一个scatter散点图。
2. 关于参数的解释
我们根据 plt.scatter()函数的作用(生成一个散点图),就可以知道它所需要的参数大致类别有两个有:
- 横纵坐标(横纵坐标范围、每个点对应的横纵坐标)
- 散点(散点的个数、大小、样式、颜色等)
各具体参数的解释:
- n:散点个数
- X,Y:每个散点对应的横纵坐标
- label:每个散点对应的颜色 (传入到c)
- c: 示的是色彩或颜色序列,可选,默认蓝色’b’。c可以是一个RGB或RGBA二维行数组;
- cmap:Colormap,标量或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用;
- cmap = plt.cm.Spectral实现的功能是给label为1的点一种颜色,给label为0的点另一种颜色。
- s: 散点的大小
3. 在程序中的实现
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1) # 产生相同的随机数(之后如果使用random,不管运行几次都是第一次的数据)
n=10 #散点的个数
X = np.random.randn(1, n)
Y = np.random.randn(1, n)
#输出每一个点对应的坐标
print(X)
print("______________________")
print(Y)
label = np.array([1,1,0,0,0,0,0,1,1,1]) #对应每个散点的颜色
#生成一个scatter散点图。
plt.scatter(X.reshape(10), Y.reshape(10), c =label, s = 200, cmap = plt.cm.Spectral)
plt.show()
#改变一下参数
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1) # 产生相同的随机数(之后如果使用random,不管运行几次都是第一次的数据)
#散点的个数
n=5
X = np.random.randn(1, n)
Y = np.random.randn(1, n)
print(X)
print("______________________")
print(Y)
label = np.array([1,2,3,4,5]) #对应每个散点的颜色
#plt.scatter()函数用于生成一个scatter散点图。
plt.scatter(X.reshape(n), Y.reshape(n), c =label, s = 2000, cmap = plt.cm.Spectral)
plt.show()
为啥 matplotlib 需要在 plt.scatter() 之前设置日志比例而不是 plt.plot()?
【中文标题】为啥 matplotlib 需要在 plt.scatter() 之前设置日志比例而不是 plt.plot()?【英文标题】:Why does matplotlib require setting log scale before plt.scatter() but not plt.plot()?为什么 matplotlib 需要在 plt.scatter() 之前设置日志比例而不是 plt.plot()? 【发布时间】:2016-12-12 12:22:52 【问题描述】:我在helpful answer 中发现,当在 y 轴上使用对数刻度时,plt.scatter()
和 plt.plot()
的行为不同。
使用plot
,我可以在使用plt.show()
之前随时更改为日志,但必须预先设置日志,在使用分散方法之前。
这只是 matplotlib 中的历史和不可逆转的工件,还是属于“意外行为”类别?
import matplotlib.pyplot as plt
X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437]
Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435,
0.025435, 0.000503, 2.320735]
plt.figure()
plt.subplot(2,2,1)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('scatter - scale last')
plt.subplot(2,2,2)
plt.plot(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('plot - scale last')
plt.subplot(2,2,3)
plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)
plt.title('scatter - scale first')
plt.subplot(2,2,4)
plt.xscale('log')
plt.yscale('log')
plt.plot(X, Y)
plt.title('plot - scale first')
plt.show()
【问题讨论】:
@Kartik 有很多人非常熟悉 matplotlib,他们所做的不仅仅是在这里磕磕绊绊。我在这里问这个问题是因为我有一种预感,一个精通 matplotlib 的人会帮助我了解是否有可能改变 scatter 方法,或者它是否是那些不会发生的事情之一。也许我也没有注意到这种差异实际上有好处! 我建议您也可以在 matplotlib git hub 上打开一个关于此的问题。也许它会作为一个预期的功能被击落,或者它可能会导致更新。 @uhoh 我不知道你为什么认为这是一个废话。我只是指出差异似乎是由于 ylimits 的选择方式。如果您致电plt.gca().relim()
,您仍然会得到不正确的 y 轴范围。基于this answer,其中一位开发人员在创建后调用xscale
和yscale
应该不是问题,所以我猜这是一个错误。
@Kartik 我已经冒险了 - Github 中的 matplotlib 问题 #6915。
请让这些 cmets 线程少受热。
【参考方案1】:
这在某种程度上与matplotlib
计算的显示区域(轴限制)有关。
此行为已通过使用 set_xlim
和 set_ylim
方法手动编辑坐标区范围得到修复。
plt.figure()
plt.scatter(X, Y)
plt.yscale('log')
plt.xscale('log')
axes = plt.gca()
axes.set_xlim([min(X),max(X)])
axes.set_ylim([min(Y),max(Y)])
plt.show()
但是,我还没有弄清楚这种行为的确切原因。欢迎提出建议。
编辑
如 cmets 部分所述,显然 Matplotlib 已在其官方 Github 存储库中将 Autoscaling has fundamental problems 确定为 发布关键问题,这将在即将发布的版本中修复。谢谢。
【讨论】:
如果您检查问题下的 cmets,您会看到 this one 链接到更多信息。如果您添加到第二个Autoscaling has fundamental problems #7413 的链接,我会接受您的回答,这个问题可以关闭! @uhoh 完成。谢谢。 回答了另外一个问题,只有5,189,568 to go! ;-)以上是关于关于plt.scatter()的使用的主要内容,如果未能解决你的问题,请参考以下文章
论plt.scatter()画散点图未设置“颜色参数c”却能画出五颜六色点的原因
typeError 帮助,plt.scatter 将我的 .csv 读取为真/假而不是数值
plt.scatter(X[0, :], X[1, :], c=Y, s=40, cmap=plt.cm.Spectral)出错