[关闭]
@zhangyu756897669 2017-10-12T14:41:34.000000Z 字数 6209 阅读 646

用python进行数据可视化

python


python中最流行的工具之一是matplotlib,它是一个数学绘图库,我们将使用它来制作简单的图表,如折线图和散点图。然后,我们将基于随机漫步概念生成一个更有趣的数据集——根据一系列随机决策生成的图表。

首先,我们需要安装matplotlib库

  1. pip install matplotlib

用pyton绘制简单的折线图

  1. import matplotlib.pyplot as plt
  1. squares = [1, 4, 9, 16, 25]
  2. plt.plot(squares)
  3. plt.show()

我们首先导入了模块pyplot,并给它指定了别名plt,以免反复输入pyplot。模块pyplot包含很多用于生成图表的函数。
我们创建了一个列表,在其中存储了平方数,再将这个列表传递给函数plot(),这个函数尝试根据这些数字绘制出有意义的图形。plt.show()打开matplotlib查看器,并显示绘制的图形,如图所示:
图一

修改标签文字和线条粗细

  1. import matplotlib.pyplot as plt
  2. squares = [1,4, 9, 16, 25]
  3. plt.plot(squares, linewidth = 5) #1
  4. # 设置图表标题, 并给坐标轴加上标签
  5. plt.title('Square Number', fontsize =24) #2
  6. plt.xlabel("Value", fontsize =14)
  7. plt.ylabel("Square of Value", fontsize = 14)
  8. # 设置刻度标记的大小
  9. plt.tick_params(axis = 'both', labelsize =14) #3
  10. plt.show()

图2

校正图形

当你向plot()提供一系列数字时,它假设第一个数据点对应的x坐标值为0,但我们的第一个点对应的x值为1。为改变这种默认行为,我们可以给plot()同时提供输入值和输出值:

  1. import matplotlib.pyplot as plt
  2. input_values = [1, 2, 3, 4, 5]
  3. squares = [1, 4, 9, 16, 25]
  4. plt.plot(input_values, squares, linewidth=5)
  1. # 设置图表标题, 并给坐标轴加上标签
  2. plt.title('Square Number', fontsize =24)
  3. plt.xlabel("Value", fontsize =14)
  4. plt.ylabel("Square of Value", fontsize = 14)
  5. # 设置刻度标记的大小
  6. plt.tick_params(axis = 'both', labelsize =14)
  7. plt.show()

图3
现在plot()将正确地绘制数据,因为我们同时提供了输入值和输出值,它无需对输出值的生成方式作出假设

使用scatter()绘制散点图并设置其样式

有时候,需要绘制散点图并设置各个数据点的样式。
要绘制单个点,可使用函数scatter(),并向它传递一对x和y坐标,它将在指定位置绘制一个点:

  1. import matplotlib.pyplot as plt
  2. plt.scatter(2,4)
  3. plt.show()

然而我们也可以设置:添加标题,给轴加上标签,并确保所有文本都大到能够看清:

  1. import matplotlib.pyplot as plt
  2. plt.scatter(2, 4, s = 300) # 1
  3. # 设置图标标题并给坐标轴加上标签
  4. plt.title("Square Number", fontsize = 24)
  5. plt.xlabel("Value", fontsize = 14)
  6. plt.ylabel("Square of Value", fontsize=14)
  7. # 设置刻度标记的大小
  8. plt.tick_params(axis='both', which='major', labelsize=14)
  9. plt.show()


在1处,我们调用了scatter(),并使用实参s设置了绘制图形时使用的点的尺寸

我们也可使用scatter()绘制一系列点,可向scatter()传递两个分别包含x值和y值的列表

  1. import matplotlib.pyplot as plt
  2. x_values = [1, 2, 3, 4, 5]
  3. y_values = [1, 4, 9, 16, 25]
  4. plt.scatter(x_values, y_values, s=100)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=14)
  9. # 设置刻度标记的大小
  10. plt.tick_params(axis='both', which='major', labelsize=14)
  11. plt.show()


列表x_values包含要计算其平方值的数字,而列表y_values包含前述每个数字的平方值。将这些列表传递给scatter()时,matplotlib依次从每个列表中读取一个值来绘制一个点。要绘制的点的坐标分别为 (1, 1)、(2, 4)、(3, 9)、(4, 16)和(5, 25)

自动计算数据

在需要绘制的点很多时,我们可以让Python循环来替我们完成计算。

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001)) #1
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, s =40) #2
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=14)
  9. # 设置每个坐标轴的取值范围
  10. plt.axis([0, 1100, 0, 1100000]) #3
  11. plt.show()


我们首先创建了一个包含x值的列表,其中包含数字1~1000(见1)。接下来是一个生成y值的列表解析,它遍历x值(for x in x_values),计算其平方值(x**2),并将结果存储到列表y_values中。然后,将输入列表和输出列表传递给scatter()(见2)。由于这个数据集较大,我们将点设置得较小,并使用函数axis()指定了每个坐标轴的取值范围(见3)。函数axis()要求提供四个值:x和y坐标轴的最小值和最大值。在这里,我们将x坐标轴的取值范围设置为0~1100,并将y坐标轴的取值范围设置为0~1 100 000。

删除数据点的轮廓

matplotlib允许你给散点图中的各个点指定颜色。默认为蓝色点和黑色轮廓,绘制很多点时,黑色轮廓可能会粘连在一起。要删除数据点的轮廓,可在调用scatter()时传递实参edgecolor='none':

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001))
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, s =40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. # 设置每个坐标轴的取值范围
  10. plt.axis([0, 1100, 0, 1100000])
  11. plt.scatter(x_values, y_values, edgecolor='none', s=20)
  12. plt.show()

自定义颜色

要修改数据点的颜色,可向scatter()传递参数c,并将其设置为要使用的颜色的名称,如下所示:

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001))
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, s =40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. # 设置每个坐标轴的取值范围
  10. plt.axis([0, 1100, 0, 1100000])
  11. plt.scatter(x_values, y_values, c='red', edgecolor='none',s=40)
  12. plt.show()

你还可以使用RGB颜色模式自定义颜色。要指定自定义颜色,可传递参数c,并将其设置为一个元组,其中包含三个0~1之间的小数值,它们分别表示红色、绿色和蓝色分量,值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。例如,下面的代码行创建一个由淡蓝色点组成的散点图:

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001))
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, s =40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. # 设置每个坐标轴的取值范围
  10. plt.axis([0, 1100, 0, 1100000])
  11. plt.scatter(x_values, y_values, c=(0,0,0.7), edgecolor='none', s=40)
  12. plt.show()

使用颜色映射

颜色映射(colormap)是一系列颜色,它们从起始颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律。例如:可用较浅的颜色表示小数据, 较深的颜色表示较大的数据。

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001))
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor = 'none', s=40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. plt.show()

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001))
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, c=x_values, cmap=plt.cm.Greens, edgecolor = 'none', s=40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. plt.show()

我们将参数c设置成了一个y值列表,并使用参数cmap告诉pyplot使用哪个颜色映射。这些代
码将y值较小的点显示为浅蓝色,并将y值较大的点显示为深蓝色

要了解pyplot中所有的颜色映射,请访问http://matplotlib.org/,单击Examples,向下滚动
到Color Examples,再单击colormaps_reference。

自动保存图表

要让程序自动将图表保存到文件中,可将对plt.show()的调用替换为对plt.savefig()的调用

  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 1001))
  3. y_values = [x**2 for x in x_values]
  4. plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor = 'none', s=40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. plt.savefig('squares_plot.png', bbox_inches = 'tight')


第一个实参指定要以什么样的文件名保存图表,这个文件将存储到scatter_squares.py所在的目录中;第二个实参指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可省略这个实参

题目

请绘制一个图形,显示前5个整数的4次方值,再绘制一个图形,显示前100 个整数的立方值。并将图形指定映射。

  1. import matplotlib.pyplot as plt
  2. x_values = [1, 3, 5, 7, 9]
  3. y_values = [x**4 for x in x_values]
  4. plt.scatter(x_values, y_values, s=40)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. plt.show()
  1. import matplotlib.pyplot as plt
  2. x_values = list(range(1, 100))
  3. y_values = [x**3 for x in x_values]
  4. plt.scatter(x_values, y_values, c=x_values, cmap=plt.cm.Greens, edgecolor = 'none', s=20)
  5. # 设置图标标题并给坐标轴加上标签
  6. plt.title("Square Number", fontsize = 24)
  7. plt.xlabel("Value", fontsize = 14)
  8. plt.ylabel("Square of Value", fontsize=24)
  9. plt.show()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注