15.1 安装Matplotlib
15.2绘制简单的折线图
模块pyplot包含很多用于生成图表的函数
subplot()可在一张图片中绘制一个或者多个图标
import matplotlib.pyplot as plt squares = [1, 4, 9, 16, 25] fig, ax = plt.subplots() ax.plot(squares) plt.show()
15.2.1修改标签文字和线条粗细
import matplotlib.pyplot as plt squares = [1, 4, 9, 16, 25] fig, ax = plt.subplots() ax.plot(squares, linewidth=3) ax.set_title('平方数', fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值", fontsize=14) ax.tick_params(axis="both", labelsize=14) plt.show()
15.2.2校正图形
import matplotlib.pyplot as plt input_values = [1, 2, 3, 4, 5] squares = [1, 4, 9, 16, 25] fig, ax = plt.subplots() ax.plot(input_values, squares, linewidth=3) 向plot()同时提供输入值与输出值 ax.set_title('平方数', fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值", fontsize=14) ax.tick_params(axis="both", labelsize=14) plt.show()
15.2.3使用内置样式
plt.style.use("seaborn")
15.2.4使用scatter()绘制散点图并设置样式
要绘制一个点,可使用方法scatter()。它将在指定位置绘制一个点
import matplotlib.pyplot as plt plt.style.use("seaborn-ticks") fig, ax = plt.subplots() ax.scatter(2,4) plt.show()
import matplotlib.pyplot as plt plt.style.use("seaborn-ticks") fig, ax = plt.subplots() ax.scatter(2, 4, s=200) 设置绘制图形时使用的点的尺寸 ax.set_title('平方数', fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值", fontsize=14) plt.show()
15.2.5使用scatter()绘制一系列点
import matplotlib.pyplot as plt plt.style.use("seaborn-ticks") x_values = [1, 2, 3, 4, 5] y_values = [1, 4, 9, 16, 25] fig, ax = plt.subplots() ax.scatter(x_values, y_values, s=200) ax.set_title('平方数', fontsize=24) ax.set_xlabel("值", fontsize=14) ax.set_ylabel("值", fontsize=14) plt.show()
15.2.6自动计算数据
我们不必手工计算包含点的列表,可以用python循环来完成。
x_values = range(1, 1001) y_values = [x*x for x in x_values] fig, ax = plt.subplots()
ax.axis([0,1100, 0,1100000])这个函数包含四个参数,分别为x与y坐标轴的最小值与最大值。
15.2.7自定义颜色
ax.scatter(x_values, y_values, c="red", s=10) 颜色c也可用RGB来表示
15.2.8使用颜色映射
颜色映射时一系列颜色,从起始颜色渐变到结束颜色。可用于突出数据的规律。
ax.scatter(x_values, y_values, c=y_values,cmap=plt.cm.Blues, s=10)
15.2.9自动保存图表
要让程序自动将图表保存到文件中,可将调用plt.show()替换为plt.savefig()
15.3随机漫步
随机漫步是这样行走得到的路径:每次行走都是完全随机的,没有明确的方向,结果是由一系列随机决策决定的。
15.3.1创建RandomWalk类
class RandomWalk: def __init__(self, num_points=5000): self.num_points = num_points self.x_values = 0 self.y_values = 0
15.3.2选择方向
def fill_walk(self): while len(self.x_values) < self.num_points: x_direction = choice([1, -1]) x_distance = choice([0, 1, 2, 3, 4]) x_step =x_distance * x_distance y_direction = choice([1, -1]) y_distance = choice([1, 2, 3, 4, 5]) y_step = y_direction * y_distance if x_step == 0 and y_step == 0: continue x =self.x_values[-1] + x_step y =self.y_values[-1] + y_step self.x_values.append(x) self.y_values.append(y)
15.3.3绘制随机漫步图
import matplotlib.pyplot as plt from random_walk import RandomWalk rw = RandomWalk() rw.fill_walk() plt.style.use("classic") fig, ax = plt.subplots() ax.scatter(rw.x_values, rw.y_values, s=15) plt.show()
15.3.4模拟多次随机漫步
while True: rw = RandomWalk() rw.fill_walk() plt.style.use("classic") fig, ax = plt.subplots() ax.scatter(rw.x_values, rw.y_values, s=15) plt.show() keep_running = input("Make another walk?(y/n)") if keep_running == "n": break
15.3.5设置随机漫步图的样式
1.给点着色
ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors="none", s=15)
2.重新绘制起点和终点
ax.scatter(0, 0, c="green", edgecolor="none", s=100) ax.scatter(rw.x_values[-1], rw.y_values[-1], c="red", edgecolor="none", s=100)
3.隐藏坐标轴
ax.get_xaxis().set_visible(False) ax.get_xaxis().set_visible(False)
4.增加点数
rw = RandomWalk(50000)
5.调整尺寸以合适的屏幕
fig, ax = plt.subplots(figsize=(15,9))
15.4使用Plotly模拟掷骰子
15.4.1安装Plotly
15.4.2创建Die类
from random import randint class Die: def __init__(self, num_sides=6): #骰子的默认面数 self.num_sides = num_sides def roll(self): return randint(1, self.num_sides) #返回一个在1与面数之间的随机数
15.4.3掷骰子
from die import Die die = Die() results = [] for roll in range(100): result = die.roll() results.append(result) print(results)
15.4.4分析结果
for value in range(1, die.num_sides+1): frequency = results.count(value) frequencies.append(frequency) print(frequencies)
统计每个点出现的个数
15.4.5绘制直方图
hist = pygal.Bar() hist.title = "Results of rolling one D6 1000 times." hist.x_labels = ["1", "2", "3", "4", "5", "6"] hist.x_title = "Result" hist.y_title = "Frequency of Result" hist.add("D6", frequencies) hist.render_to_file("die_visual.svg")
15.4.6同时掷两个骰子
同时掷两个筛子时,得到的点数更多,结果分布情况也不相同。
import pygal as pygal from die import Die die1 = Die() die2 = Die() results = [] for roll in range(10000): result = die1.roll() + die2.roll() results.append(result) # 分析结果 frequencies = [] max_result = die1.num_sides + die2.num_sides for value in range(2, max_result+1): frequency = results.count(value) frequencies.append(frequency) print(frequencies) hist = pygal.Bar() hist.title = "Results of rolling two D6 1000 times." hist.x_labels = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"] hist.x_title = "Result" hist.y_title = "Frequency of Result" hist.add("D6+D6", frequencies) hist.render_to_file("dice_visual.svg")