程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python學習——使用Pygal生成矢量圖

編輯:Python

使用Pygal

pygal是python的可視化包,只要用來生成可以生成可縮放的矢量圖形文件,對於需要在尺寸不同的屏幕上顯示的圖表,它們將自動縮放,以適應觀看者的屏幕。
如果你打算以在線方式使用圖表,請考慮使用Pygal來生成它們,這樣它們在任何設備上顯示時都會很美觀。
#矢量圖放大不失真

(1)安裝pygal包
Linux和OSX系統

pip install --user pygal

Windows系統

python -m pip install --user pygal

【注意】:你可能需要使用命令pip3 而不是pip ,如果這還是不管用,你可能需要刪除標志–user 。
要了解使用Pygal可創建什麼樣的圖表,請查看圖表類型畫廊:訪問http://www.pygal.org/ ,單擊Documentation,再單擊Chart types。每個示例都包含源代碼,讓你知道這些圖表是如何生成的。
(2)案例模擬
【案例需求】:使用Pygal模擬擲骰子。
【案例模擬】:擲6面的常規骰子時,可能出現的結果為1~6點,且出現每種結果的可能性相同。然而,如果同時擲兩個骰子,某些點數出現的可能性將比其他點數大。為確定哪些點數出現的可能性最大,我們將生成一個表示擲骰子結果的數據集,並根據結果繪制出一個圖形。
【案例實現】:

#創建Die類
class Die():
"""表示一個骰子的類"""
def __init__(self, num_sides=6):
"""骰子默認為6面"""
self.num_sides = num_sides
def roll(self):
""""返回一個位於1和骰子面數之間的隨機值"""
return randint(1, self.num_sides)

模擬擲骰子
情形一、擲一個6面的骰子,分析結果

#擲一個6面的骰子
def roll_die():
#實例一個骰子對象,面數采用默認值
die = Die()
#擲幾次骰子,並將結果存儲在一個列表中
results = []
for roll_num in range(1000):#循環擲100次
result = die.roll()
results.append(result)#把結果存入結果列表
#補充 range(end) 默認從0開始,即0-end-1 含0,不含end
# 分析擲骰子結果 results結果集
#frequencies={}
frequencies =[]
for value in range(1, die.num_sides + 1):
frequency = results.count(value)#統計頻數,每一個數字出現了幾次
frequencies.append(frequency)#存入列表
#frequencies[value]=frequency #存入字典
print(frequencies)
#根據結果進行繪制圖形分析 可視化
#1、直方圖(條形圖) pygal.Bar() 創建條形圖實例
hist = pygal.Bar() #創建條形圖實例
#繪制標題
hist.title = "Results of rolling one D6 1000 times."
#繪制x軸標簽
hist.x_labels = ['1', '2', '3', '4', '5', '6']
#繪制x軸標題
hist.x_title = "Result"
#繪制y軸標題
hist.y_title = "Frequency of Result"
#使用add() 將一系列值添加到圖表中,向它傳遞要給添加的值指定的標簽,還有一個列表,其中包含將出現在圖表中的值
hist.add('D6', frequencies) #D6是標簽(圖例) frequencies數據列表
#將圖表渲染成svg文件,文件的擴展名必須為.svg
hist.render_to_file('single_roll.svg')
#注意:Pygal讓這個圖表具有交互性:如果你將鼠標指向該圖表中的任何條形,將看到與之相關聯的數據。
#問題:實際操作時,發現鼠標移到圖片上沒有顯示數據。
#原因:Pygal版本太老,和目前所用的python版本不兼容,或者使用的浏覽器版本太低
#解決:更新Pygal pip install --upgrade pygal

【small tips】:
(1)創建條形圖
【語法】:chart=pygal.Bar(style=**,x_label_rotation=角度,show_legend=False/True)
注意:chart是pygal的實例,Bar首字母必須大寫;style為樣式,x_label_rotation旋轉角度(順時針旋轉);show_legend是否顯示圖例。
(2)svg
是一種可縮放的矢量圖像圖形文件格式,這種格式的文件具有邊緣清晰、文件體積小、傳輸方便的特點,因此在網頁設計中比較常用。
【結果展示】:

情形二、同時擲2個6面的骰子

#同時擲兩個6面的骰子
def double_roll():
# 創建兩個D6骰子
die_1 = Die()
die_2 = Die()
# 擲骰子多次,並將結果存儲到一個列表中
results = []
for roll_num in range(1000):
result = die_1.roll() + die_2.roll()
results.append(result)
#分析結果
frequencies = []
max_result = die_1.num_sides + die_2.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.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D6', frequencies)
hist.render_to_file('double_roll.svg')

【解析】:算法思路與擲一個骰子一致,只是以相同的算法,新建了兩個骰子實例。
【結果展示】:

情形三、同時擲兩個面數不同的骰子

def double_diff():
#實例化一個6面骰子和一個10面骰子
die_1 = Die()
die_2 = Die(10)
# 擲骰子多次,並將結果存儲在一個列表中
results = []
for roll_num in range(50000):
result = die_1.roll() + die_2.roll()
results.append(result)
# 分析結果 要完成一個數據頻數統計的功能
frequencies = []
#計算可能的結果最大數
max_result = die_1.num_sides + die_2.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 a D6 and a D10 50,000 times."
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D10', frequencies)
#保存為svg矢量圖格式
hist.render_to_file('double_diff_roll.svg')

【解析】:算法思路與擲一個骰子一致,只是以相同的算法,新建了兩個骰子實例。
【補充】:
先將展示3種生成hist.x_labels列表的方法:
法一、for循環生成

 #for循環生成 hist.x_labels列表
xs = []
for value in range(2, max_result + 1):
xs.append(value)
hist.x_labels = xs

法二、列表解析法

 #列表解析法
xs=[value for value in range(2,max_result+1)]
hist.x_labels = xs

法三、直接賦值

hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']

實現hist.x_labels列表自動生成,可將方法推廣至hist.y_labels以及其他列表的生成

==》python列表的生成都可以使用以上這三種方法


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved