数据可视化:折线图、直方图、散点图
目录
1、折线图
2、直方图
3、散点图
4、颜色映射(colormap)
5、pygal模块(svg格式)
6、随机漫步
重要知识点
import matplotlib.pyplot as plt — 绘制2D折线图,直方图,散点图等
import numpy as np — 将列表转换为数组,给图形上每个点添加标签时会用到
import pygal — pygal是一个SVG图表库。SVG是一种矢量图格式,全称Scalable Vector Graphics — 可缩放矢量图形。
from random import choice — 生成随机漫步数据,函数choice([])从列表中随机输出一个数
from random import randint –randint()从一个区间随机返回一个数
1、折线图
plt.plot() 绘制折线图
np.array() 将列表转换为存储单一数据类型的多维数组,例如[1 2 3 4 5]
zip(x,y) 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内 存。我们可以使用 list() 转换来输出列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*号操作符,可以将元组解压为列表,例如a1,a2 = zip(*zip(a,b))。
plt.annotate() 给折线点设置(x,y)坐标值
plt.tick_params() 设置刻度线和标签的大小,颜色,内外侧,both代表xy同时设置
plt.title()设置图表标题
plt.xlabel() 设置X轴标签
plt.ylabel() 设置Y轴标签
plt.axis([]) 设置X,Y轴刻度的取值范围
plt.savefig(\’\’) 保存图表为图片格式
plt.show() 打开matplotlib查看器,并显示绘制的图形
#模块pyplot包含很多生成图表的函数 import matplotlib.pyplot as plt import numpy as np input_values = [1,2,3,4,5,6] squares = [1,4,9,16,25,36] #plot()绘制折线图 plt.plot(input_values,squares,linewidth=5,color=\'m\') #np.array()将列表转换为存储单一数据类型的多维数组 x = np.array(input_values) y = np.array(squares) #annotate()给折线点设置坐标值 for a,b in zip(x,y): plt.annotate(\'(%s,%s)\'%(a,b),xy=(a,b),xytext=(-25,15), textcoords=\'offset points\') #设置标题 plt.title(\'Square Numbers\',fontsize=24) plt.xlabel(\'Value\',fontsize=14) plt.ylabel(\'Square of Value\',fontsize=14) #设置刻度线和标签的大小,颜色,内外侧,both代表xy同时设置 plt.tick_params(axis=\'both\',direction=\'in\',colors=\'c\',labelsize=14) plt.axis([0,8,0,45]) plt.savefig(\'images\line_chart.png\') #show()打开matplotlib查看器,并显示绘制的图形 plt.show()
2、直方图
plt.bar() 绘制直方图
plt.text() 给条形柱添加标签
import numpy as np import matplotlib.pyplot as plt #创建带数字标签的直方图 numbers = list(range(1,11)) x = np.array(numbers) y = np.array([a**2 for a in numbers]) #绘制图形 plt.bar(x,y,width=0.5,align=\'center\',color=\'c\') plt.title(\'Square Numbers\',fontsize=24) plt.xlabel(\'Value\',fontsize=14) plt.ylabel(\'Square of Value\',fontsize=14) plt.tick_params(axis=\'both\',labelsize=14) #设置xy轴坐标取值范围 plt.axis([0,11,0,110]) #设置标签,a,b代表标签的坐标,第二个为标签内容,然后是对齐方式和尺寸 for a,b in zip(x,y): plt.text(a,b+0.1,\'%.0f\'%b,ha = \'center\',va = \'bottom\',fontsize=7) plt.savefig(\'images\squares.png\') plt.show()
3、散点图
plt.scatter() 绘制散点图
#scatter()绘制散点图 import matplotlib.pyplot as plt x_values = list(range(1,11)) y_values = [x**2 for x in x_values] #参数c为点的颜色,默认蓝色;edgecolor为点的轮廓颜色,默认黑色,none为无色 plt.scatter(x_values,y_values,c=\'white\',edgecolor=\'green\',s=1000) \'\'\' 还可以使用RGB模式,向参数c传递一个元组,包含三个0-1之间的小数, 他们分别代表红绿蓝的份量,越接近0,颜色越深,越接近1,颜色越浅 c=(0,0,0.8),代表淡蓝色 \'\'\' #设置标题 plt.title(\'Square Numbers\',fontsize=24) plt.xlabel(\'Value\',fontsize=14) plt.ylabel(\'Square of Value\',fontsize=14) #设置刻度的大小,both代表xy同时设置 plt.tick_params(axis=\'both\',labelsize=14) #设置坐标轴的取值范围 plt.axis([0,11,-20,110]) #plt.savefig(\'images\squares_plot1.png\') plt.show()
4、颜色映射(colormap)
#根据每个点的Y值来设置颜色映射 x_values = list(range(1,11)) y_values = [x**2 for x in x_values] \'\'\'参数c设置成Y值列表,代表各点的先后顺序,使用参数camp告诉 pyplot使用什么颜色映射,s为点的大小 \'\'\' plt.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Reds, edgecolor=\'green\',s=1000) plt.title(\'Square Numbers\',fontsize=24) plt.xlabel(\'Value\',fontsize=14) plt.ylabel(\'Square of Value\',fontsize=14) plt.tick_params(axis=\'both\',labelsize=14) plt.axis([0,11,-20,110]) #savefig()自动保存图表,第二个参数表示删除图表多余的空白区域 plt.savefig(\'images\squares_plot2.png\',bbox_inches=\'tight\') plt.show()
5、pygal模块(svg格式)
randint(1,5) 从一个区间随机返回一个数,包括两端的数
hist = pygal.Bar() 定义直方图类
hist.x_labels=[] 设置X轴刻度
hist.x_title=\'\' X轴标题
hist.y_title=\'\' Y轴标题
hist.add(\' \',[]) 绘制直方图,\'\'内为图表标题
hist.render_to_file(\'\') 保存到文件夹
#pygal模块:创建可缩放的矢量图形文件(.svg) import pygal from random import randint class Die(): def __init__(self,num_sides=6): self.num_sides = num_sides def roll(self): \'\'\'函数randint()返回一个区间的任意数值\'\'\' return randint(1,self.num_sides) #创建一个6面骰子,摇1000次,将结果存在列表中 die_1 = Die() die_2 = Die(10) results = [die_1.roll() + die_2.roll() for roll_num in range(5000)] #分析每一种结果的出现频率,存在一个列表中 max_result = die_1.num_sides + die_2.num_sides frequencies = [results.count(value) for value in range(2,max_result+1)] #对结果进行可视化,hist:频数直方图 hist = pygal.Bar() hist.x_labels = list(range(2,max_result+1,1))#x轴刻度 hist.x_title = \'Result\' # 标题 hist.y_title = \'Freqency of Rsult\' #add()向它传递一个指定的标签,一个列表,包含将出现在图表中的值 hist.add(\'D6 + D10\',frequencies) hist.render_to_file(\'images\hist.svg\')
6、随机漫步
choice([])从列表中随机输出一个数
figure()用于指定图表的宽度、高度、分辨率和背景色,形参figsize需要指定一个元组,单位为英寸,dpi为分辨率,facecolor为窗口边框颜色
plt.axes().get_xaxis().set_visible(False) 隐藏坐标轴
line = pygal.Line() 绘制可缩放的折线图
import matplotlib.pyplot as plt import pygal from random import choice class RandomWalk(): \'\'\'一个生成随机漫步数据的类\'\'\' def __init__(self,num_points): self.num_points = num_points #所有的随机漫步都始于(0,0) self.x_values = [0] self.y_values = [0] def get_step(self): direction = choice([1, -1]) # 随机选择向左向右两个方向 distance = choice([0, 1, 2, 3, 4, 5, 6, 7, 8]) # 随机选择移动的距离 return direction * distance # 每次移动的步长 def fill_walk(self): \'\'\'定义一个循环,直到达到给定的点数\'\'\' while len(self.x_values) < self.num_points: x_step = self.get_step() y_step = self.get_step() #拒绝原地踏步 if x_step and y_step == 0: continue #计算下一个点的xy值,用列表的最后一个值加上步长 next_x = self.x_values[-1] + x_step next_y = self.y_values[-1] + y_step self.x_values.append(next_x) self.y_values.append(next_y) rw = RandomWalk(5000) rw.fill_walk() #绘制特定窗口尺寸和分辨率的随机漫步散点图 plt.figure(figsize=(6,6),dpi=128,facecolor=\'palegreen\') point_numbers = list(range(rw.num_points)) #以颜色映射的方式展示出来,可以看出漫步中各点的先后顺序 plt.scatter(rw.x_values,rw.y_values,c=point_numbers, cmap=plt.cm.Greens,edgecolor=\'none\',s=1) #重新绘制第一个和最后一个点,突出显示 plt.scatter(0,0,c=\'red\',edgecolors=\'none\',s=100) plt.scatter(rw.x_values[-1],rw.y_values[-1],c=\'orange\', edgecolors=\'none\',s=100) #exes()隐藏坐标轴 plt.axes().get_xaxis().set_visible(False) plt.axes().get_yaxis().set_visible(False) #plt.savefig(r\'images\random_plot1.png\') plt.show() \'\'\'生成随机漫步折线图\'\'\' rw = RandomWalk(5000) rw.fill_walk() plt.plot(rw.x_values,rw.y_values,color=\'cyan\',linewidth=1) plt.axes().get_xaxis().set_visible(False) plt.axes().get_yaxis().set_visible(False) plt.show() \'\'\'利用pygal实现随机漫步折线图\'\'\' lc = RandomWalk(5000) lc.fill_walk() line_chart = pygal.Line() line_chart.x_labels = map(str, range(0, 9)) line_chart.add(\'random\',lc.y_values) line_chart.render_to_file(r\'images\random.svg\')