python编程从入门到实践 之 数据可视化部分总结和回顾(未完待续)
15.1生成數(shù)據(jù)
matplotlib:是一個(gè)數(shù)學(xué)繪圖庫,使用它可以制作簡單的圖標(biāo)。
pygal包:專注于生成適合在數(shù)字設(shè)備上顯示的圖標(biāo)。通過使用pygal,可以在與圖表交互時(shí)突出元素以及調(diào)整大小,還可以輕松調(diào)整整個(gè)圖表的尺寸。pygal我自己的理解是python graphics adapt library,即python圖形適配器。
這兩個(gè)部分安裝就不敘述了,書上有的。安裝后在解釋器中運(yùn)行:
import matplotlib如果沒有任何出錯(cuò)信息,說明安裝正確。
另外,要查看由matplotlib制作的各種圖表,請(qǐng)?jiān)L問:https://matplotlib.org/示例的畫廊。單擊畫廊中的圖表,就可以查看用于生成圖表的代碼。
15.2 繪制簡單的折線圖
#導(dǎo)入pyplot,并指定了別名plt,避免反復(fù)鍵入pyplot import matplotlib.pyplot as plt # squares = [1,4,9,16,25,36,49] plt.plot(squares) plt.show()注意:我自己實(shí)踐,可以吧import matplot.pyplot 寫成如下形式
from matplotlib import pyplot運(yùn)行后,得到如下圖像?
15.2.1修改標(biāo)簽文字和線條粗細(xì)
上圖中的圖標(biāo)標(biāo)簽太小,線條太細(xì),下面自己定制。
import matplotlib.pyplot as pltsquares = [1,4,9,16,25,36,49] #linewidth決定了plot畫的線條的粗細(xì) plt.plot(squares,linewidth=5)#設(shè)置圖標(biāo)標(biāo)題,并加上標(biāo)簽 plt.title("Squares Numbers",fontsize=24) plt.xlabel("Value:",fontsize=14) #加上x軸標(biāo)簽,字體14 plt.ylabel("Square of Value:",fontsize=14) #給y軸加上標(biāo)簽,字體14#設(shè)置刻度標(biāo)記的大小(也就是坐標(biāo)軸上數(shù)字標(biāo)記的大小) plt.tick_params(axis='both',labelsize=14) plt.show()
?
15.2.2矯正圖形
圖形繪制以后,我們發(fā)現(xiàn)沒有正確地繪制數(shù)據(jù):折線圖的終點(diǎn)指出6的平方為49,下面來修復(fù)這個(gè)問題。
當(dāng)你向plot提供一系列的數(shù)字時(shí),它假設(shè)第一個(gè)數(shù)據(jù)點(diǎn)對(duì)應(yīng)的x坐標(biāo)紙為0,但我們的第一個(gè)點(diǎn)對(duì)應(yīng)的值x為1,為了改變這種默認(rèn)的行為,我們可以給plot()同時(shí)提供輸入值和輸出值:
...snip... inputvalues = [1,2,3,4,5,6,7] squares = [1,4,9,16,25,36,49] #linewidth決定了plot畫的線條的粗細(xì) plt.plot(inputvalues,squares,linewidth=5) #同時(shí)提供輸入值和輸出值 ...snip...plt還可以指定更多的實(shí)際參數(shù)。后路將會(huì)學(xué)習(xí)到。
15.2.3
import matplotlib.pyplot as plt#繪制單個(gè)點(diǎn),傳給scatter一對(duì)x和y坐標(biāo)即可 plt.scatter(2,4,s=100) plt.show() ~注:scatter可以畫單個(gè)點(diǎn),也可以畫一系列的點(diǎn),前者傳遞單個(gè)點(diǎn)的坐標(biāo),后者傳遞2列表。
練習(xí)15-1
#15-1(1)import matplotlib.pyplot as plt inputvalues = list(x for x in range(1,6)) values = list(x**3 for x in range(1,6)) plt.scatter(inputvalues,values,s=10) plt.show() ~ #15-1(2) import matplotlib.pyplot as plt inputvalues = list(x for x in range(1,5001)) values = list(x**3 for x in range(1,5001)) #使用顏色漸變模式 plt.scatter(inputvalues,values,c=values,cmap=plt.cm.Blues,s=10) plt.show()知識(shí)點(diǎn)總結(jié)
一、plt下的plot 和 scatter畫圖
(仿照mysql語句語法格式,[]內(nèi)部分是可以省略的部分),有的時(shí)候[]代表一個(gè)列表,大家可以自己嘗試運(yùn)行代碼進(jìn)行鑒別:
(1)導(dǎo)入庫下面的方法
?
或者
from matplotlib import pyplot as plt(2)畫圖函數(shù)
plt.plot(inputvalues,outputvalues,line_width=NUM)? ?plt.scatter(xvalues,yvalues,s=SQUAREVALUES)表示畫散點(diǎn)圖,s代表每個(gè)點(diǎn)內(nèi)由多少個(gè)像素組成,
這里面有個(gè)edgecolor表示有沒有輪廓,默認(rèn)有輪廓,但是我試了下,指定edgecolor='none'后,效果完全一樣的。
形如參數(shù)c='red',表示指定顏色的參數(shù)。對(duì)plot和scatter都是適用的。c也可以用rgb顏色模式指定,
例如:c=(0,0,0.2),當(dāng)值越大,顏色越深,值越小,顏色越淡。
#下面plot函數(shù)內(nèi)的[]不是可省略的意思,是指的一個(gè)列表
(3)設(shè)置標(biāo)題,x軸,y軸標(biāo)簽,下面三個(gè)函數(shù)參數(shù)設(shè)置方法一致
plt.title("title_contents",fontsize=NUM)
plt.xlabel(...)
plt.ylabel(...)
(4)設(shè)置坐標(biāo)軸刻度大小的函數(shù)
plt.tick_params(axis='both',labelsize=NUM)
(5)指定x和y坐標(biāo)范圍(xmaximum和ymuximum分別是x和y坐標(biāo)的最大值)
plt.axis([0,xmaximum,0,ymaximum])? ??
plt.plot([xvalues_list],y_values,line_width=WIDTH_VALUE),line_width 表示線的寬度是多少像素
(7)顯示函數(shù)
plt.show()? 顯示畫的圖形并且結(jié)束程序
plt.savefig('PICTURE_NAME',bbox_inches='tight'),第一個(gè)參數(shù)表示圖像名稱,第二個(gè)參數(shù)表示裁剪多余的部分,tight表示緊身的,代表將裁剪多余的部分
注意:bbox_inches='tight'只是刪除圖形周圍的所有額外空白區(qū)域,它在渲染完成后并未實(shí)際重新排列圖形中的任何內(nèi)容。
(8)顏色映射
關(guān)于顏色映射,類似如下格式
plt.scatter(x_values,y_values,c=y_values,...)
c可以賦值為y_values或者直接賦值一個(gè)list(range(len(y_values))),也就是一個(gè)自然數(shù)列表。如果賦值為自然數(shù)列表,那么顏色變化速度慢,如果賦值的列表內(nèi)的數(shù)據(jù)變化速度快,那么顏色變化速度非常快。
(9)隱藏坐標(biāo)軸
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
(10)調(diào)整繪圖窗口大小,分辨率,背景色等:
plt.figure(figsize(x,y))
例如: plt.figure(figsize=(10,6)),表示繪圖窗口是10英寸 * 6英寸
plt.figure(figsize=(10,6),dpi=)
二、pygal生成可縮放的矢量圖形文件
如果打算在線方式生成圖表,那么pygal很有用,會(huì)根據(jù)觀看者的屏幕來調(diào)整圖片大小。在任何設(shè)備上顯示都很美觀。
? ? ? ?http://www.pygal.org/? ? ?然后進(jìn)入Documentation,單擊Chart types。每個(gè)示例都包括源代碼,這讓你知道這些圖表是如何生成的。
pygal知識(shí)點(diǎn):
一、相關(guān)知識(shí)點(diǎn)
1.定義一個(gè)Bar圖 ?? hist = pygal.Bar()
2.給圖形加標(biāo)題? hist.title = 'some title'
3.給圖形加x坐加標(biāo)記: hist.x_labels = ['','','','','']是一個(gè)列表,列表中的元素可以是str類型,不能是int類型
4.給x,y坐標(biāo)加標(biāo)題? hist.x_title? = '??? '? and hist.y_title = '???? '
5.加 標(biāo)簽 + 值 hist.add('label_of_value',y_values)?? y_values是一個(gè)列表
6.渲染到文件 hist.render_to_file('filename')?? filename必須是一個(gè)svg文件
from die import Die import pygaldie = Die() results = [] for roll_num in range(100):result = die.roll()results.append(result) print(results) frequencies = [] for value in range(1,die.num_sides + 1):frequency = results.count(value)frequencies.append(frequency) print(frequencies)# 對(duì)結(jié)果進(jìn)行可視化 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')再來個(gè)2個(gè)骰子的程序:
from die import Die import pygaldie1 = Die() die2 = Die()#擲骰子多次,并把結(jié)果放在一個(gè)列表中 results = [] for roll_num in range(1000):result = die1.roll() + die2.roll()results.append(result)#分析結(jié)果 frequencies = [] max_result = die1.num_sides + die2.num_sides for value in range(2,max_result + 1):frequency = results.count(value)frequencies.append(frequency)hist = pygal.Bar() hist.title = 'Results of rolling two D6 dice 1000 times.' hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12'] hist.y_title = 'Frequency of Result'hist.add('D6 + D6',frequencies) hist.render_to_file('two_d6.svg') print(frequencies)15.3隨機(jī)漫步
練習(xí)15-3
#文件walk.py import matplotlib.pyplot as plt from random_walk import RandomWalkwhile True:rw = RandomWalk(5000)rw.fill_walk()plt.figure(figsize=(10,6),dpi=100)num_points = list(range(rw.num_count))#plot 沒有edgecolor和像 scatter那樣的顏色映射,不能用s設(shè)置點(diǎn)的面積,需要用linewidth設(shè)置plt.plot(rw.x_values,rw.y_values,c='red',linewidth=1,)plt.scatter(0,0,s=100,c='red',edgecolor='none')plt.scatter(rw.x_values[-1],rw.y_values[-1],s=100,edgecolor='none')#plt.axes().get_xaxis().set_visible(False)#plt.axes().get_yaxis().set_visible(False)plt.show()info = input("Another walk?(y/n)")if info == 'n' or info == 'N':break #文件random_walk.pyfrom random import choice import matplotlib.pyplot as plt class RandomWalk():def __init__(self,num_count = 5000):self.x_values = [0]self.y_values = [0]self.num_count = num_countdef fill_walk(self):while len(self.x_values) < self.num_count: x_direction = choice([1,-1])x_step = choice([0,1,2,3,4])x_step = x_direction * x_stepy_direction = choice([1,-1])y_step = choice([0,1,2,3,4])y_step = y_step * y_directionif x_step == 0 and y_step == 0:continuex_value = x_step + self.x_values[-1]y_value = y_step + self.y_values[-1]self.x_values.append(x_value)self.y_values.append(y_value)練習(xí)15-5
random_walk.py改成如下:
from random import choice import matplotlib.pyplot as plt class RandomWalk():def __init__(self,num_count = 5000):self.x_values = [0]self.y_values = [0]self.num_count = num_countdef fill_walk(self):while len(self.x_values) < self.num_count: x_step = self.get_step()y_step = self.get_step()if x_step == 0 and y_step == 0:continuex_value = x_step + self.x_values[-1]y_value = y_step + self.y_values[-1]self.x_values.append(x_value)self.y_values.append(y_value)def get_step(self):direction = choice([-1,1])distance = choice([0,1,2,3,4])step = direction * distancereturn step總結(jié)
以上是生活随笔為你收集整理的python编程从入门到实践 之 数据可视化部分总结和回顾(未完待续)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构和算法学习的开端
- 下一篇: MySQL中变量的定义和变量的赋值使用(