python-生成数据

文章目录

1 绘制简单折线图

1.1 绘制简单的折线图

下面使用Matplotlib绘制一个简单的折线图,再对其进行定制,以实现信息更丰富的数据可视化效果。我们将使用平方数序列1、4、9、16和25来绘制这个图表。

import matplotlib.pyplot as plt

squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(squares)
plt.show()

创建了一个名为squares 的列表,在其中存储要用来制作图表的数据。然后,采取了另一种常见的Matplotlib做法——调用函数subplots() 。这个函数可在一张图片中绘制一个或多个图表。变量fig 表示整张图片。变量ax 表示图片中的各个图表,大多数情况下要使用它。
运行截图:

python-生成数据

1.2 修改图表

参数linewidth决定了plot() 绘制的线条粗细。
方法set_title()给图表指定标题。
fontsize 指定图表中各种文字的大小。
方法set_xlabel() 和set_ylabel() 让你能够为每条轴设置标题。方法tick_params() 设置刻度的样式,其中指定的实参将影响X轴和 Y轴上的刻度(axes=’both’ ),并将刻度标记的字号设置为14(labelsize=14)。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(squares,linewidth=3) #linewidth决定了绘制的线条粗细

#设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

#设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

运行截图:

python-生成数据

如果报错显示没有中文字体的话,加入下面这两句话:

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

1.3 校正图形

图形更容易看清后,我们发现没有正确地绘制数据:折线图的终点指出4.0的平方为25!下面来修复这个问题。
向plot() 提供一系列数时,它假设第一个数据点对应的坐标值为0,但这里第一个点对应的值为1。为改变这种默认行为,可向plot() 同时提供输入值和输出值:

...

input_values=[1,2,3,4,5]
ax.plot(input_values,squares,linewidth=3) #linewidth决定了绘制的线条粗细
...

运行截图:

python-生成数据

1.4 使用内置样式

Matplotlib提供了很多已经定义好的样式,它们使用的背景色、网格线、线条粗细、字体、字号等设置很不错,让你无须做太多定制就可生成引人瞩目的可视化效果。要获悉在你的系统中可使用哪些样式,可在终端会话中执行如下命令:

import matplotlib.pyplot as plt
print(plt.style.available)

会出现:

python-生成数据
要使用这些样式,可在生成图表的代码前添加如下代码行:
...

plt.style.use('bmh')
...

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

input_values=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.style.use('bmh')
fig,ax=plt.subplots()
ax.plot(input_values,squares,linewidth=3) #linewidth决定了绘制的线条粗细

#设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

#设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

plt.show()

运行截图:

python-生成数据

2 绘制散点图

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

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

plt.style.use('bmh')
fig,ax=plt.subplots()
ax.scatter(2,4,s=200)#这个点在指定位置,(x,y)=(2,4)使用参数s绘制图形时使用的点的尺寸

#设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

#设置刻度标记的大小
ax.tick_params(axis='both',which='major',labelsize=14)

plt.show()

运行截图:

python-生成数据

2.2 使用scatter()绘制一系列点

要绘制一系列的点,可向scatter() 传递两个分别包含x值和y值的列表,如下所示:

...

x_values=[1,2,3,4,5]
y_values=[1,4,9,16,25]
ax.scatter(x_values,y_values,s=100)
...

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

python-生成数据
看下面一个例子,将点与线结合
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

squares=[1,4,9,16,25]
x_values=[1,2,3,4,5]
y_values=[1,4,9,16,25]
input_values=[1,2,3,4,5]

plt.style.use('bmh')
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,s=100)
ax.plot(input_values,squares,linewidth=3) #linewidth决定了绘制的线条粗细

#设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

#设置刻度标记的大小
ax.tick_params(axis='both',which='major',labelsize=14)

plt.show()

运行截图:

python-生成数据

2.3 自动计算数据

下面是绘制1000个点的代码

x_values=range(1,1001)
y_values=[x**2 for x in x_values]
ax.axis([0,1100,0,1100000])#设置每个坐标轴的取值范围
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

x_values=range(1,1001)
y_values=[x**2 for x in x_values]

plt.style.use('bmh')
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,s=10)

#设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

#设置刻度标记的大小
ax.tick_params(axis='both',which='major',labelsize=14)

ax.axis([0,1100,0,1100000])#设置每个坐标轴的取值范围

plt.show()

运行截图:

python-生成数据

2.4 使用颜色映射

颜色映射 (colormap)是一系列颜色,从起始颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律。 例如,你可能用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值。模块pyplot 内置了一组颜色映射。要使用这些颜色映射,需要告诉pyplot 该如何设置数据集中每个点的颜色。

ax.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Blues,s=10)

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

运行截图:

python-生成数据

2.5 自动保存图表

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

plt.savefig('squares_plot.png',bbox_inches='tight')

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

python-生成数据

3 使用plotly模拟掷骰子

本节将使用Python包Plotly来生成交互式图表。需要创建在浏览器中显示的图表时,Plotly很有用,因为它生成的图表将自动缩放以适合观看者的屏幕。Plotly生成的图表还是交互式的:用户将鼠标指向特定元素时,将突出显示有关该元素的信息。

3.1 创建Die类

die.py
from random import randint
class Die:
    def __init__(self,num_sides=6): #骰子默认是6面
       self.num_sides=num_sides
    def roll(self): #返回一个位于1和骰子面数之间的随机值
        return randint(1,self.num_sides)

方法roll()使用函数randint()来返回一个1和面数之间的随机数。

3.2 掷骰子

die_visual.py
from die import Die
die=Die()

#掷几次骰子并将结果存储在一个列表中
results=[]
for roll_num in range(100):
    result=die.roll()
    results.append(result)

print(results)

掷骰子100次,并将每次的结果都存储在列表results中。
运行截图:

python-生成数据

3.3 分析结果

分析掷一个D6的结果,计算每个点数出现的次数。

from die import Die
die=Die()

#掷几次骰子并将结果存储在一个列表中
results=[]
for roll_num in range(1000):
    result=die.roll()
    results.append(result)

分析结果
frequencies=[]
for value in range(1,die.num_sides):#遍历可能的点数(1-6),计算每种点数在results中出现了多少次
    frequency=results.count(value) #count()方法用于统计某个元素在列表中出现的次数。
    frequencies.append(frequency)#并将这个值附加到列表frequencies的末尾

print(frequencies)

运行截图:

python-生成数据

3.4 绘制直方图

有了频率列表,就可以绘制一个表示结果的直方图了。

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die
die=Die()

#掷几次骰子并将结果存储在一个列表中
results=[]
for roll_num in range(1000):
    result=die.roll()
    results.append(result)

分析结果
frequencies=[]
for value in range(1,die.num_sides+1):
    frequency=results.count(value) #count()方法用于统计某个元素在列表中出现的次数。
    frequencies.append(frequency)

#对结果进行可视化
x_values=list(range(1,die.num_sides+1))#range生成数字1-6,plotly不能接受range()的结果,需要使用函数list()将其转换为列表
data=[Bar(x=x_values,y=frequencies)]

x_axis_config={'title':'结果'}
y_axis_config={'title':'结果的频率'}

my_layout=Layout(title='掷一个D6 1000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)

offline.plot({'data':data,'layout':my_layout},filename='d6.html')

1.pycharm中导入plotly包–参考博客

from plotly.graph_objs import Bar,Layout
from plotly import offline

2.Plotly不能直接接受函数range() 的结果,因此需要使用函数list() 将其转换为列表。
3.Plotly类Bar() 表示用于绘制条形图的数据集,需要一个存储值的列表和一个存储值的列表。这个类必须放在方括号内,因为数据集可能包含多个元素。
4.类Layout() 返回一个指定图表布局和配置的对象。这里设置了图表名称,并传入了x轴和y轴的配置字典。
5.调用了函数offline.plot() 。这个函数需要一个包含数据和布局对象的字典,还接受一个文件名,指定要将图表保存到哪里。这里将输出存储到文件d6.html。
6.运行程序die_visual.py时,可能打开浏览器并显示文件d6.html。如果没有自动显示d6.html,可在任意Web浏览器中新建一个标签页,再在其中打开文件d6.html(它位于die_visual.py所在的文件夹中)。
运行截图:

python-生成数据

注意,Plotly让这个图表具有交互性:如果将鼠标指向其中的任意条形,就能看到与之相关联的数据。在同一个图表中绘制多个数据集时,这项功能特别有用。另外,注意到右上角有一些图标,让你能够平移和缩放图表以及将其保存为图像。

3.5 同时掷两个骰子

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die
die1=Die()
die2=Die()

#掷几次骰子并将结果存储在一个列表中
results=[]
for roll_num in range(1000):
    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) #count()方法用于统计某个元素在列表中出现的次数。
    frequencies.append(frequency)

#对结果进行可视化
x_values=list(range(2,max_result+1))#range生成数字1-6,plotly不能接受range()的结果,需要使用函数list()将其转换为列表
data=[Bar(x=x_values,y=frequencies)]

x_axis_config={'title':'结果','dtick':1} #使用dtick制定了x轴显示的刻度间距
y_axis_config={'title':'结果的频率'}

my_layout=Layout(title='掷两个D6 1000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)

offline.plot({'data':data,'layout':my_layout},filename='d6_d6.html')

运行截图·:

python-生成数据

3.6 同时掷两个面数不同的骰子

下面来创建一个6面骰子和一个10面骰子,看看同时掷这两个骰子50 000次的结果如何

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die
die1=Die()
die2=Die(10)

#掷几次骰子并将结果存储在一个列表中
results=[]
for roll_num in range(50000):
    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) #count()方法用于统计某个元素在列表中出现的次数。
    frequencies.append(frequency)

#对结果进行可视化
x_values=list(range(2,max_result+1))#range生成数字1-6,plotly不能接受range()的结果,需要使用函数list()将其转换为列表
data=[Bar(x=x_values,y=frequencies)]

x_axis_config={'title':'结果','dtick':1} #使用dtick制定了x轴显示的刻度间距
y_axis_config={'title':'结果的频率'}

my_layout=Layout(title='掷一个D6和一个D10 50 000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)

offline.plot({'data':data,'layout':my_layout},filename='d6_d10.html')

运行截图:

python-生成数据

持续更新中

python-生成数据

Original: https://blog.csdn.net/ls158390/article/details/123408653
Author: 深海零娄
Title: python-生成数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/697112/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球