Matplotlib 散点图

创建散点图

应用 Pyplot 库, 您可以使用 scatter() 函数来绘制散点图.

scatter() 函数为每次观察绘制一个点。它需要两个长度相同的数组,一个用于 x 轴上的值,另一个用于 y 轴上的值:

实例

一个简单的散点图:

  1. import sys
  2. import matplotlib
  3. matplotlib.use('Agg')
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  7. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  8. plt.scatter(x, y)
  9. plt.show()
  10. #Two lines to make our compiler able to draw:
  11. plt.savefig(sys.stdout.buffer)
  12. sys.stdout.flush()
结果:

上面例子中的观察结果是 13 辆汽车经过的结果。

X 轴显示汽车的使用年限。

Y 轴显示汽车通过时的速度。

观察结果之间有什么关系吗?

看起来车越新,开得越快,但这可能是巧合,毕竟我们只登记了 13 辆车。


比较绘图

在上面的例子中,速度和年龄之间似乎有关系,但是如果我们也绘制另一天的观察结果呢?散点图会告诉我们其他的事情吗?

实例

在同一个的图形种进行两个绘图:

  1. #Three lines to make our compiler able to draw:
  2. import sys
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. #day one, the age and speed of 13 cars:
  8. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  9. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  10. plt.scatter(x, y)
  11. #day two, the age and speed of 15 cars:
  12. x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12])
  13. y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85])
  14. plt.scatter(x, y)
  15. plt.show()
  16. #Two lines to make our compiler able to draw:
  17. plt.savefig(sys.stdout.buffer)
  18. sys.stdout.flush()
结果:

注意:这两个图以两种不同的颜色绘制,默认为蓝色和橙色,您将在本章后面学习如何更改颜色。

通过比较这两个图,我们可以肯定地说,它们都给了我们相同的结论:车越新,开得越快。


颜色

您可以使用 color 或者 c 参数来为每个散点图设置自己的颜色:

实例

设置您自己的标记颜色:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  4. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  5. plt.scatter(x, y, color = 'hotpink')
  6. x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12])
  7. y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85])
  8. plt.scatter(x, y, color = '#88c999')
  9. plt.show()
结果:


给每个点上色

您甚至可以使用 c 参数,颜色数组作为每个点的值,为每个点设置特定的颜色:

注意:不能使用 color 参数,只能使用 c 参数。
实例

设置您自己的标记颜色:

  1. #Three lines to make our compiler able to draw:
  2. import sys
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  8. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  9. plt.scatter(x, y, color = 'hotpink')
  10. x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12])
  11. y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85])
  12. plt.scatter(x, y, color = '#88c999')
  13. plt.show()
  14. #Two lines to make our compiler able to draw:
  15. plt.savefig(sys.stdout.buffer)
  16. sys.stdout.flush()
结果:


ColorMap 色度图

Matplotlib 模块有许多可用的ColorMap。

ColorMap 类似于颜色列表,其中每种颜色的值范围为 0 到 100。

以下是 ColorMap 的示例:

这个 ColorMap 称为 "viridis" ,可以看到它的范围从 0(紫色)到 100(黄色)。:

如何使用 ColorMap

您可以使用关键字参数 cmap和 colormap 的值指定 colormap ,在这种情况下,viridis是 Matplotlib 中可用的内置 colormap 之一。

此外,还必须创建一个具有值(从 0 到 100 )的数组,散点图中的每个点对应一个值:

实例

创建颜色数组,并在散点图中指定 colormap:

  1. #Three lines to make our compiler able to draw:
  2. import sys
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  8. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  9. colors = np.array(["red","green","blue","yellow","pink","black","orange","purple","beige","brown","gray","cyan","magenta"])
  10. plt.scatter(x, y, c=colors)
  11. plt.show()
  12. #Two lines to make our compiler able to draw:
  13. plt.savefig(sys.stdout.buffer)
  14. sys.stdout.flush()
结果:

通过包含 plt.colorbar() 语句,可以在图形中包含 colormap:

实例

包含实际的 colormap:

  1. import sys
  2. import matplotlib
  3. matplotlib.use('Agg')
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  7. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  8. colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100])
  9. plt.scatter(x, y, c=colors, cmap='viridis')
  10. plt.show()
  11. plt.savefig(sys.stdout.buffer)
  12. sys.stdout.flush()
结果:

可用的 ColorMap

您可用选择任何内置的 ColorMap:

颜色 反色
Accent试一试 » Accent_r试一试 »
Blues试一试 » Blues_r试一试 »
BrBG试一试 » BrBG_r试一试 »
BuGn试一试 » BuGn_r试一试 »
BuPu试一试 » BuPu_r试一试 »
CMRmap试一试 » CMRmap_r试一试 »
Dark2试一试 » Dark2_r试一试 »
GnBu试一试 » GnBu_r试一试 »
Greens试一试 » Greens_r试一试 »
Greys试一试 » Greys_r试一试 »
OrRd试一试 » OrRd_r试一试 »
Oranges试一试 » Oranges_r试一试 »
PRGn试一试 » PRGn_r试一试 »
Paired试一试 » Paired_r试一试 »
Pastel1试一试 » Pastel1_r试一试 »
Pastel2试一试 » Pastel2_r试一试 »
PiYG试一试 » PiYG_r试一试 »
PuBu试一试 » PuBu_r试一试 »
PuBuGn试一试 » PuBuGn_r试一试 »
PuOr试一试 » PuOr_r试一试 »
PuRd试一试 » PuRd_r试一试 »
Purples试一试 » Purples_r试一试 »
RdBu试一试 » RdBu_r试一试 »
RdGy试一试 » RdGy_r试一试 »
RdPu试一试 » RdPu_r试一试 »
RdYlBu试一试 » RdYlBu_r试一试 »
RdYlGn试一试 » RdYlGn_r试一试 »
Reds试一试 » Reds_r试一试 »
Set1试一试 » Set1_r试一试 »
Set2试一试 » Set2_r试一试 »
Set3试一试 » Set3_r试一试 »
Spectral试一试 » Spectral_r试一试 »
Wistia试一试 » Wistia_r试一试 »
YlGn试一试 » YlGn_r试一试 »
YlGnBu试一试 » YlGnBu_r试一试 »
YlOrBr试一试 » YlOrBr_r试一试 »
YlOrRd试一试 » YlOrRd_r试一试 »
afmhot试一试 » afmhot_r试一试 »
autumn试一试 » autumn_r试一试 »
binary试一试 » binary_r试一试 »
bone试一试 » bone_r试一试 »
brg试一试 » brg_r试一试 »
bwr试一试 » bwr_r试一试 »
cividis试一试 » cividis_r试一试 »
cool试一试 » cool_r试一试 »
coolwarm试一试 » coolwarm_r试一试 »
copper试一试 » copper_r试一试 »
cubehelix试一试 » cubehelix_r试一试 »
flag试一试 » flag_r试一试 »
gist_earth试一试 » gist_earth_r试一试 »
gist_gray试一试 » gist_gray_r试一试 »
gist_heat试一试 » gist_heat_r试一试 »
gist_ncar试一试 » gist_ncar_r试一试 »
gist_rainbow试一试 » gist_rainbow_r试一试 »
gist_stern试一试 » gist_stern_r试一试 »
gist_yarg试一试 » gist_yarg_r试一试 »
gnuplot试一试 » gnuplot_r试一试 »
gnuplot2试一试 » gnuplot2_r试一试 »
gray试一试 » gray_r试一试 »
hot试一试 » hot_r试一试 »
hsv试一试 » hsv_r试一试 »
inferno试一试 » inferno_r试一试 »
jet试一试 » jet_r试一试 »
magma试一试 » magma_r试一试 »
nipy_spectral试一试 » nipy_spectral_r试一试 »
ocean试一试 » ocean_r试一试 »
pink试一试 » pink_r试一试 »
plasma试一试 » plasma_r试一试 »
prism试一试 » prism_r试一试 »
rainbow试一试 » rainbow_r试一试 »
seismic试一试 » seismic_r试一试 »
spring试一试 » spring_r试一试 »
summer试一试 » summer_r试一试 »
tab10试一试 » tab10_r试一试 »
tab20试一试 » tab20_r试一试 »
tab20b试一试 » tab20b_r试一试 »
tab20c试一试 » tab20c_r试一试 »
terrain试一试 » terrain_r试一试 »
twilight试一试 » twilight_r试一试 »
twilight_shifted试一试 » twilight_shifted_r试一试 »
viridis试一试 » viridis_r试一试 »
winter试一试 » winter_r试一试 »

大小

您可以使用 s 参数更改这些点的大小。

与颜色一样,请确保大小数组的长度与 x 轴和 y 轴数组的长度相同:

实例

为标记设置自己的大小:

  1. #Three lines to make our compiler able to draw:
  2. import sys
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  8. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  9. sizes = np.array([20,50,100,200,500,1000,60,90,10,300,600,800,75])
  10. plt.scatter(x, y, s=sizes)
  11. plt.show()
  12. #Two lines to make our compiler able to draw:
  13. plt.savefig(sys.stdout.buffer)
  14. sys.stdout.flush()
结果:


透明度

您可以使用 alpha 参数调这些点的透明度。

与颜色一样,请确保大小数组的长度与 x 轴和 y 轴数组的长度相同:

实例

为标记设置自己的大小和透明度:

  1. #Three lines to make our compiler able to draw:
  2. import sys
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
  8. y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
  9. sizes = np.array([20,50,100,200,500,1000,60,90,10,300,600,800,75])
  10. plt.scatter(x, y, s=sizes, alpha=0.5)
  11. plt.show()
  12. #Two lines to make our compiler able to draw:
  13. plt.savefig(sys.stdout.buffer)
  14. sys.stdout.flush()
结果:


结合颜色大小和透明度

您可以在点上组合不同大小的 colopmap。如果圆点是透明的,则最好将其可视化:

实例

为 x 点、y 点、颜色和大小创建具有100个值的随机数组:

  1. #Three lines to make our compiler able to draw:
  2. import sys
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. x = np.random.randint(100, size=(100))
  8. y = np.random.randint(100, size=(100))
  9. colors = np.random.randint(100, size=(100))
  10. sizes = 10 * np.random.randint(100, size=(100))
  11. plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='nipy_spectral')
  12. plt.colorbar()
  13. plt.show()
  14. #Two lines to make our compiler able to draw:
  15. plt.savefig(sys.stdout.buffer)
  16. sys.stdout.flush()
结果: