C語言中文網 目錄

Python Pygal常見數據圖(折線圖、柱狀圖、餅圖、點圖、儀表圖和雷達圖)詳解

< 上一頁Python Pygal Python讀取csv文件下一頁 >

Pygal 同樣支持各種不同的數據圖,比如餅圖、折線圖等。Pygal 的設計很好,不管是創建哪種數據圖,Pygal 的創建方式基本是一樣的,都是先創建對應的數據圖對象,然后添加數據,最后對數據圖進行配置。因此,使用 Pygal 生成數據圖是比較簡單的。

折線圖

折線圖與柱狀圖很像,它們只是表現數據的方式不同,柱狀圖使用條柱代表數據,而折線圖則使用折線點來代表數據。因此,生成折線圖的方式與生成柱狀圖的方式基本相同。

使用 pygal.Line 類來表示折線圖,程序創建 pygal.Line 對象就是創建折線圖。下面程序示范了利用折線圖來展示兩套教程銷量統計數據的方法。
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 構造數據
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 創建pygal.Line對象(折線圖)
line = pygal.Line()
# 添加兩組代表折線的數據
line.add('C語言教程', y_data)
line.add('Python教程', y_data2)
# 設置X軸的刻度值
line.x_labels = x_data
# 重新設置Y軸的刻度值
line.y_labels = [20000, 40000, 60000, 80000, 100000]
line.title = '編程教程的歷年銷量'
# 設置X、Y軸的標題
line.x_title = '年份'
line.y_title = '銷量'
# 設置將圖例放在底部
line.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
line.render_to_file('fk_books.svg')
上面程序中的第 8 行代碼創建了 pygal.Line 對象,該對象代表折線圖。接下來程序調用 pygal.Line 對象的 add() 方法添加統計數據,然后對數據圖進行配置。

運行上面程序,將會生成如圖 1 所示的折線圖。

折線圖
圖 1 折線圖

水平柱狀圖和水平折線圖

使用 pygal.HorizontalBar 類來表示水平柱狀圖。使用 pygal.HorizontalBar 生成水平柱狀圖的步驟與創建普通柱狀圖的步驟基本相同。下面程序示范了使用 pygal.HorizontalBar 生成水平柱狀圖來展示兩套教程歷年銷量統計數據的方法:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 構造數據
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 創建pygal.HorizontalBar對象(水平柱狀圖)
horizontal_bar = pygal.HorizontalBar()
# 添加兩組數據
horizontal_bar.add('C語言教程', y_data)
horizontal_bar.add('Python教程', y_data2)
# 設置Y軸(確實如此)的刻度值
horizontal_bar.x_labels = x_data
# 重新設置X軸(確實如此)的刻度值
horizontal_bar.y_labels = [20000, 40000, 60000, 80000, 100000]
horizontal_bar.title = '編程教程的歷年銷量'
# 設置X、Y軸的標題
horizontal_bar.x_title = '銷量'
horizontal_bar.y_title = '年份'
# 設置將圖例放在底部
horizontal_bar.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
horizontal_bar.render_to_file('fk_books.svg')
上面程序中第 8 行代碼創建 pygal.HorizontalBar 對象作為水平柱狀圖,這與前面創建普通柱狀圖并無差別。在設置 pygal.HorizontalBar 對象時有一點需要注意,x_labels 屬性用于設置 Y 軸的刻度值,而 y_labels 屬性用于設置 X 軸的刻度值。

運行上面程序,將會生成如圖 2 所示的水平柱狀圖。


圖 2 水平柱狀圖

與水平柱狀圖類似的還有水平折線圖,水平折線圖使用 pygal.HorizontalLine 類來表示,水平折線圖的 X 軸刻度值同樣使用 y_labels 屬性來設置,而 Y 軸刻度值才使用 x_labels 屬性來設置。

例如如下程序所示:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 構造數據
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 創建pygal.HorizontalLine對象(水平折線圖)
horizontal_line = pygal.HorizontalLine()
# 添加兩組代表折線的數據
horizontal_line.add('C語言教程', y_data)
horizontal_line.add('Python教程', y_data2)
# 設置Y軸(確實如此)的刻度值
horizontal_line.x_labels = x_data
# 重新設置X軸(確實如此)的刻度值
horizontal_line.y_labels = [20000, 40000, 60000, 80000, 100000]
horizontal_line.title = '編程教程的歷年銷量'
# 設置X、Y軸的標題
horizontal_line.x_title = '銷量'
horizontal_line.y_title = '年份'
# 設置將圖例放在底部
horizontal_line.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
horizontal_line.render_to_file('fk_books.svg')

疊加柱狀圖和疊加折線圖

有些時候,客戶重點關心的不是兩個產品在同一年的銷量對比(應該使用普通柱狀圖),而是兩個產品的累計銷量,此時應該使用疊加柱狀圖或疊加折線圖。

對于疊加柱狀圖而言,代表第二組數據的條性會疊加在代表第一組數據的條柱上,這樣可以更方便地看到兩組數據的累加結果。疊加柱狀圖使用 pygal.StackedBar 類來表示,程序使用 pygal.StackedBar 創建疊加柱狀圖的步驟與創建普通柱狀圖的步驟基本相同。

下面程序示范了使用 pygal.StackedBar 創建疊加柱狀圖來展示兩種圖書銷量數據匯總的方法:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 構造數據
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 創建pygal.StackedBar對象(疊加柱狀圖)
stacked_bar = pygal.StackedBar()
# 添加兩組數據
stacked_bar.add('C語言教程', y_data)
stacked_bar.add('Python教程', y_data2)
# 設置X軸的刻度值
stacked_bar.x_labels = x_data
# 重新設置Y軸的刻度值
stacked_bar.y_labels = [20000, 40000, 60000, 80000, 100000]
stacked_bar.title = '編程教程的歷年銷量'
# 設置X、Y軸的標題
stacked_bar.x_title = '銷量'
stacked_bar.y_title = '年份'
# 設置將圖例放在底部
stacked_bar.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
stacked_bar.render_to_file('fk_books.svg')
上面程序中,第 8 行代碼創建了 pygal.StackedBar 對象,該對象就代表一個疊加柱狀圖。接下來程序同樣先為疊加柱狀圖添加數據,然后配置疊加柱狀圖。

運行上面程序,將會生成如圖 3 所示的疊加柱狀圖。


圖 3 疊加柱狀圖

從圖 3 可以看到,代表第二組數據的條柱疊加在代表第一組數據的條柱上。

與疊加柱狀圖類似的還有疊加折線圖,疊加折線圖使用 pygal.StackedLine 類來表示,疊加折線圖的第二組折線的數據點同樣疊加在第一組折線的數據點上。

關于疊加折線圖,可參考如下程序:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 構造數據
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 創建pygal.StackedBar對象(疊加折線圖)
stacked_line = pygal.StackedLine()
# 添加兩組數據
stacked_line.add('C語言教程', y_data)
stacked_line.add('Python教程', y_data2)
# 設置X軸的刻度值
stacked_line.x_labels = x_data
# 重新設置Y軸的刻度值
stacked_line.y_labels = [20000, 40000, 60000, 80000, 100000]
stacked_line.title = '編程教程的歷年銷量'
# 設置X、Y軸的標題
stacked_line.x_title = '銷量'
stacked_line.y_title = '年份'
# 設置將圖例放在底部
stacked_line.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
stacked_line.render_to_file('fk_books.svg')
對應的是, 如果客戶需要讓疊加柱狀圖和疊加折線圖以水平方式顯示,則 Pygal 提供了 pygal.HorizontalStackedBar 和 pygal.HorizontalStackedLine 類來生成水平疊加柱狀圖和水平疊加折線圖。

餅圖

Pygal 提供了 pygal.Pie 類來支持餅圖,程序在創建 pygal.Pie 對象之后,同樣需要調用 add() 方法來添加統計數據。

pygal.Pie 對象支持如下兩個特有的屬性:
  • inner_radius:設置餅圖內圈的半徑。通過設置該屬性可實現環形數據圖。
  • half_pie:將該屬性設置為True,可實現半圓的餅圖。

下面程序示范了使用餅圖來展示 2018 年 8 月編程語言的統計數據:
import pygal

# 準備數據
data = [0.16881, 0.14966, 0.07471, 0.06992,
    0.04762, 0.03541, 0.02925, 0.02411, 0.02316, 0.01409, 0.36326]
# 準備標簽
labels = ['Java', 'C', 'C++', 'Python',
    'Visual Basic .NET', 'C#', 'PHP', 'JavaScript',
    'SQL', 'Assembly langugage', '其他']
# 創建pygal.Pie對象(餅圖)
pie = pygal.Pie()
# 采用循環為餅圖添加數據
for i, per in enumerate(data):
    pie.add(labels[i], per)
pie.title = '2018年8月編程語言'
# 設置將圖例放在底部
pie.legend_at_bottom = True
# 設置內圈的半徑長度
pie.inner_radius = 0.4
# 創建半圓數據圖
pie.half_pie = True
# 指定將數據圖輸出到SVG文件中
pie.render_to_file('language_percent.svg')
上面程序中,第 11 行代碼創建了一個 pygal.Pie 對象,該對象就表示一個餅圖。接下來程序使用循環為餅圖添加了數據。程序中第 19 行代碼設置 pygal.Pie 的 inner_radius 半徑為 0.4,這表明將該餅圖設為空心環;第 21 行代碼設置 pygal.Pie 的 half_pie 為 True,這表明將該餅圖設為半圓。

如果將上面程序中第 19、21 兩行代碼注釋掉,運行該程序,將會生成如圖 4 所示的傳統餅圖。


圖 4 傳統餅圖圖

如果取消這兩行代碼的注釋,程序將會生成空心的半圓餅圖,如圖 5 所示。


圖 5 空心的半圓餅圖

點圖

與柱狀圖使用條柱高度來代表數值的大小不同,點圖使用點(圓)的大小來表示數值的大小。Pygal 使用 pygal.Dot 類表示點圖,創建點圖的方式與創建柱狀圖的方式基本相同。

下面程序示范了使用點圖來展示圖書銷量的統計數據:
import pygal

x_data = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
# 構造數據
y_data = [58000, 60200, 63000, 71000, 84000, 90500, 107000]
y_data2 = [52000, 54200, 51500,58300, 56800, 59500, 62700]
# 創建pygal.Dot對象(點圖)
dot = pygal.Dot()
dot.dots_size = 5
# 添加兩組數據
dot.add('C語言教程', y_data)
dot.add('Python教程', y_data2)
# 設置X軸的刻度值
dot.x_labels = x_data
# 重新設置Y軸的刻度值
dot.y_labels = ['C語言教程', 'Python教程']
# 設置Y軸刻度值的旋轉角度
dot.y_label_rotation = 45
dot.title = '編程教程的歷年銷量'
# 設置X軸的標題
dot.x_title = '年份'
# 設置將圖例放在底部
dot.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
dot.render_to_file('fk_books.svg')
上面程序中,第 8 行代碼創建了 pygal.Dot 對象,該對象代表點圖。在創建了 pygal.Dot 對象之后,程序為該對象添加要展示的數據,然后配置該點圖。

運行該程序,將會生成如圖 6 所示的點圖。


圖 6 點圖

儀表(Gauge)圖

儀表圖類似于一個儀表盤,在儀表盤內使用不同的指針代表不同的數據。Pygal 使用 pygal.Gauge 類表示儀表圖。程序在創建 pygal.Gauge 對象之后,為 pygal.Gauge 對象添加數據的方式與為 pygal.Pie 對象添加數據的方式相似。

pygal.Gauge 對象有一個特別的屬性:range,該屬性用于指定儀表圖的最小值和最大值。

下面程序示范了使用儀表圖來展示各編程語言所占的市場比例:
import pygal

# 準備數據
data = [0.16881, 0.14966, 0.07471, 0.06992,
    0.04762, 0.03541, 0.02925, 0.02411, 0.02316, 0.01409, 0.36326]
# 準備標簽
labels = ['Java', 'C', 'C++', 'Python',
    'Visual Basic .NET', 'C#', 'PHP', 'JavaScript',
    'SQL', 'Assembly langugage', '其他']
# 創建pygal.Gauge對象(儀表圖)
gauge = pygal.Gauge()
gauge.range = [0, 1]
# 采用循環為儀表圖添加數據
for i, per in enumerate(data):
    gauge.add(labels[i], per)
gauge.title = '2018年8月編程語言'
# 設置將圖例放在底部
gauge.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
gauge.render_to_file('language_percent.svg')
上面程序中第 11 行代碼創建了 pygal.Gauge 對象,接下來第 12 行代碼對該對象的 range 屬性賦值,將該儀表圖的最大值賦值為 1,最小值賦值為 0。

運行該程序,將會生成如圖 7 所示的儀表圖。


圖 7 儀表圖

雷達圖

雷達圖適合用于分析各對象在不同維度的優勢和劣勢,通過雷達圖可對比每個對象在不同維度的得分。假如我們從表 8 所示的 5 個方面(平臺健壯性、語法易用性、社區活躍度、市場份額和未來趨勢)的得分來評價各編程語言的優勢。

表 8 編程語言對比
  平臺健壯性 語法易用性 社區活躍度 市場份額 未來趨勢
Java 5 4.0 5 5 5
C 4.8 2.8 4.8 4.8 4.9
C++ 4.5 2.9 4.6 4.0 4.9
Python 4.0 4.8 4.9 4.0 5
C# 3.0 4.2 2.3 3.5 2
PHP 4.8 4.3 3.9 3.0 4.5

對于表 8 所示的對比數據,我們可以使用雷達圖來展示各編程語言在不同維度的優勢。
import pygal

# 準備數據
data = [[5, 4.0, 5, 5, 5],
    [4.8, 2.8, 4.8, 4.8, 4.9],
    [4.5, 2.9, 4.6, 4.0, 4.9],
    [4.0, 4.8, 4.9, 4.0, 5],
    [3.0, 4.2, 2.3, 3.5, 2],
    [4.8, 4.3, 3.9, 3.0, 4.5]]
# 準備標簽
labels = ['Java', 'C', 'C++', 'Python',
    'C#', 'PHP']
# 創建pygal.Radar對象(雷達圖)
rader = pygal.Radar()
# 采用循環為雷達圖添加數據
for i, per in enumerate(labels):
    rader.add(labels[i], data[i])
rader.x_labels = ['平臺健壯性', '語法易用性', '社區活躍度',
    '市場份額', '未來趨勢']
rader.title = '編程語言對比圖'
# 控制各數據點的大小
rader.dots_size = 8
# 設置將圖例放在底部
rader.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
rader.render_to_file('language_compare.svg')
上面程序中第 14 行代碼創建了 pygal.Rader 對象,接下來程序使用循環為雷達圖添加數據。在雷達圖上會顯示各編程語言在不同維度的得分點,程序中第 22 行代碼設置了得分點的大小。

運行該程序,將會生成如圖 9 所示的雷達圖。


圖 9 雷達圖
< 上一頁Python Pygal Python讀取csv文件下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo