@zhangyu756897669
2017-10-12T14:41:34.000000Z
字数 6209
阅读 646
python
python中最流行的工具之一是matplotlib,它是一个数学绘图库,我们将使用它来制作简单的图表,如折线图和散点图。然后,我们将基于随机漫步概念生成一个更有趣的数据集——根据一系列随机决策生成的图表。
首先,我们需要安装matplotlib库
pip install matplotlib
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares)
plt.show()
我们首先导入了模块pyplot,并给它指定了别名plt,以免反复输入pyplot。模块pyplot包含很多用于生成图表的函数。
我们创建了一个列表,在其中存储了平方数,再将这个列表传递给函数plot(),这个函数尝试根据这些数字绘制出有意义的图形。plt.show()打开matplotlib查看器,并显示绘制的图形,如图所示:
图一
import matplotlib.pyplot as plt
squares = [1,4, 9, 16, 25]
plt.plot(squares, linewidth = 5) #1
# 设置图表标题, 并给坐标轴加上标签
plt.title('Square Number', fontsize =24) #2
plt.xlabel("Value", fontsize =14)
plt.ylabel("Square of Value", fontsize = 14)
# 设置刻度标记的大小
plt.tick_params(axis = 'both', labelsize =14) #3
plt.show()
图2
当你向plot()提供一系列数字时,它假设第一个数据点对应的x坐标值为0,但我们的第一个点对应的x值为1。为改变这种默认行为,我们可以给plot()同时提供输入值和输出值:
import matplotlib.pyplot as plt
input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
# 设置图表标题, 并给坐标轴加上标签
plt.title('Square Number', fontsize =24)
plt.xlabel("Value", fontsize =14)
plt.ylabel("Square of Value", fontsize = 14)
# 设置刻度标记的大小
plt.tick_params(axis = 'both', labelsize =14)
plt.show()
图3
现在plot()将正确地绘制数据,因为我们同时提供了输入值和输出值,它无需对输出值的生成方式作出假设
有时候,需要绘制散点图并设置各个数据点的样式。
要绘制单个点,可使用函数scatter(),并向它传递一对x和y坐标,它将在指定位置绘制一个点:
import matplotlib.pyplot as plt
plt.scatter(2,4)
plt.show()
图
然而我们也可以设置:添加标题,给轴加上标签,并确保所有文本都大到能够看清:
import matplotlib.pyplot as plt
plt.scatter(2, 4, s = 300) # 1
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
图
在1处,我们调用了scatter(),并使用实参s设置了绘制图形时使用的点的尺寸
我们也可使用scatter()绘制一系列点,可向scatter()传递两个分别包含x值和y值的列表
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]
plt.scatter(x_values, y_values, s=100)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
图
列表x_values包含要计算其平方值的数字,而列表y_values包含前述每个数字的平方值。将这些列表传递给scatter()时,matplotlib依次从每个列表中读取一个值来绘制一个点。要绘制的点的坐标分别为 (1, 1)、(2, 4)、(3, 9)、(4, 16)和(5, 25)
在需要绘制的点很多时,我们可以让Python循环来替我们完成计算。
import matplotlib.pyplot as plt
x_values = list(range(1, 1001)) #1
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, s =40) #2
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=14)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000]) #3
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':
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, s =40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.scatter(x_values, y_values, edgecolor='none', s=20)
plt.show()
图
要修改数据点的颜色,可向scatter()传递参数c,并将其设置为要使用的颜色的名称,如下所示:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, s =40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.scatter(x_values, y_values, c='red', edgecolor='none',s=40)
plt.show()
图
你还可以使用RGB颜色模式自定义颜色。要指定自定义颜色,可传递参数c,并将其设置为一个元组,其中包含三个0~1之间的小数值,它们分别表示红色、绿色和蓝色分量,值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。例如,下面的代码行创建一个由淡蓝色点组成的散点图:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, s =40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 1100000])
plt.scatter(x_values, y_values, c=(0,0,0.7), edgecolor='none', s=40)
plt.show()
图
颜色映射(colormap)是一系列颜色,它们从起始颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律。例如:可用较浅的颜色表示小数据, 较深的颜色表示较大的数据。
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor = 'none', s=40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
plt.show()
图
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, c=x_values, cmap=plt.cm.Greens, edgecolor = 'none', s=40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
plt.show()
图
我们将参数c设置成了一个y值列表,并使用参数cmap告诉pyplot使用哪个颜色映射。这些代
码将y值较小的点显示为浅蓝色,并将y值较大的点显示为深蓝色
要了解pyplot中所有的颜色映射,请访问http://matplotlib.org/,单击Examples,向下滚动
到Color Examples,再单击colormaps_reference。
要让程序自动将图表保存到文件中,可将对plt.show()的调用替换为对plt.savefig()的调用
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor = 'none', s=40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
plt.savefig('squares_plot.png', bbox_inches = 'tight')
图
第一个实参指定要以什么样的文件名保存图表,这个文件将存储到scatter_squares.py所在的目录中;第二个实参指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可省略这个实参
请绘制一个图形,显示前5个整数的4次方值,再绘制一个图形,显示前100 个整数的立方值。并将图形指定映射。
import matplotlib.pyplot as plt
x_values = [1, 3, 5, 7, 9]
y_values = [x**4 for x in x_values]
plt.scatter(x_values, y_values, s=40)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
plt.show()
import matplotlib.pyplot as plt
x_values = list(range(1, 100))
y_values = [x**3 for x in x_values]
plt.scatter(x_values, y_values, c=x_values, cmap=plt.cm.Greens, edgecolor = 'none', s=20)
# 设置图标标题并给坐标轴加上标签
plt.title("Square Number", fontsize = 24)
plt.xlabel("Value", fontsize = 14)
plt.ylabel("Square of Value", fontsize=24)
plt.show()