Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

1. Pygal(チャートタイプバー)

Python可視化パッケージPygalを使用して、スケーラブルなベクターグラフィックスファイルを生成します

公式のpygalドキュメント:[www.pygal.org/en/stable/ ](http://www.pygal.org/en/stable/

1. pygalをインストールします

pip install pygal -i https://pypi.tuna.tsinghua.edu.cn/simple

2.単純なpythonチャート

import pygal
pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4).render()

SVGチャートを生成する

pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4).render_to_file("simple.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

画像を表示するには、ソースファイルを表示する必要があります。

3.複数のシリーズアイコンを作成する(バー)

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.Bar()
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

4.積み上げ棒(StackedBar)

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.StackedBar()
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

5.上のチャートのレベルを設定します(Horizo​​ntalStackedBar)

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.HorizontalStackedBar()
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

2. Pygal(さまざまなチャートタイプ)

1.基本的な単純な折れ線グラフ(折れ線)

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.Line()
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

2、横線

同じグラフィックで水平ですが、範囲は0〜100です。

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.HorizontalLine()
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.range = [0, 10]
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

3、積み重ね

同じグラフィックスですが、スタックされた値と塗りつぶしのレンダリング

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.StackedLine(fill=True)
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.range = [0, 10]
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

4、時間

時間依存グラフの場合は、ラベルをフォーマットするか、xyチャートのバリアントを使用します

import pygal
from datetime import datetime

# x_label_rotation=20是指x轴标签右旋转20度,可负数,负数向左旋转
date_chart = pygal.Line(x_label_rotation=-20)
date_chart.x_labels = map(lambda d: d.strftime('%Y-%m-%d'), [
 datetime(2013, 1, 2),
 datetime(2013, 1, 12),
 datetime(2013, 2, 2),
 datetime(2013, 2, 22)])
date_chart.add("Visits", [300, 412, 823, 672])
date_chart.render_to_file("line-time.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

ラムダは式または無名関数です

def sum(x, y):
    return x + y

ラムダでこのように書くことができます

p = lambda x, y: x + y

5、ヒストグラム

ベーシック

ヒストグラムは特殊なバーで、縦棒の高さ、横座標の始点、横座標の終点の3つの値が棒グラフに使用されます。

import pygal

hist = pygal.Histogram()
hist.add('Wide bars', [(5, 0, 10), (4, 5, 13), (2, 0, 15)])
hist.add('Narrow bars',  [(10, 1, 2), (12, 4, 4.5), (8, 11, 13)])
hist.render_to_file("histogram-basic.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

6、散布図

散布図を取得するには、ポイント間の線を無効にします

import pygal
from math import cos

xy_chart = pygal.XY()
xy_chart.title = 'XY Cosinus'
xy_chart.add('x = cos(y)', [(cos(x / 10.), x / 10.) for x in range(-50, 50, 5)])
xy_chart.add('y = cos(x)', [(x / 10., cos(x / 10.)) for x in range(-50, 50, 5)])
xy_chart.add('x = 1',  [(1, -5), (1, 5)])
xy_chart.add('x = -1', [(-1, -5), (-1, 5)])
xy_chart.add('y = 1',  [(-5, 1), (5, 1)])
xy_chart.add('y = -1', [(-5, -1), (5, -1)])
xy_chart.render_to_file("xy-basic.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

7、パイ

単純な円グラフ

import pygal

pie_chart = pygal.Pie()
pie_chart.title = 'Browser usage in February 2012 (in %)'
pie_chart.add('IE', 19.5)
pie_chart.add('Firefox', 36.6)
pie_chart.add('Chrome', 36.3)
pie_chart.add('Safari', 4.5)
pie_chart.add('Opera', 2.3)
pie_chart.render_to_file("pie-basic.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

8、マルチシリーズパイ

同じ円グラフですが、サブカテゴリに分かれています

import pygal

pie_chart = pygal.Pie()
pie_chart.title = 'Browser usage by version in February 2012 (in %)'
pie_chart.add('IE', [5.7, 10.2, 2.6, 1])
pie_chart.add('Firefox', [.6, 16.8, 7.4, 2.2, 1.2, 1, 1, 1.1, 4.3, 1])
pie_chart.add('Chrome', [.3, .9, 17.1, 15.3, .6, .5, 1.6])
pie_chart.add('Safari', [4.4, .1])
pie_chart.add('Opera', [.1, 1.6, .1, .5])
pie_chart.render_to_file("pie-multi-series.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

9、レーダー

簡単なキビエット図

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.Radar()
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.range = [0, 10]
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

10、ボックス

極値(デフォルト)

import pygal

box_plot = pygal.Box()
box_plot.title = 'V8 benchmark results'
box_plot.add('Chrome', [6395, 8212, 7520, 7218, 12464, 1660, 2123, 8607])
box_plot.add('Firefox', [7473, 8099, 11700, 2651, 6361, 1044, 3797, 9450])
box_plot.add('Opera', [3472, 2933, 4203, 5229, 5810, 1828, 9013, 4669])
box_plot.add('IE', [43, 41, 59, 79, 144, 136, 34, 102])
box_plot.render_to_file("box-extremes.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

11、ドット

import pygal

# pygal.Bar()(1, 3, 3, 7)(1, 6, 6, 4)(5,7,8,13)(5,7,4,9).render_to_file("xgp.svg")

py_bar = pygal.Dot(x_label_rotation=30)
py_bar.add("大标题",[1, 3, 3, 7])
py_bar.add("小标题",[1, 6, 6, 4])
py_bar.range = [0, 10]
py_bar.render_to_file("wsd.svg")

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

12、ファネル

ファンネルチャート

import pygal

funnel_chart = pygal.Funnel()
funnel_chart.title = 'V8 benchmark results'
funnel_chart.x_labels = ['Richards', 'DeltaBlue', 'Crypto', 'RayTrace', 'EarleyBoyer', 'RegExp', 'Splay', 'NavierStokes']
funnel_chart.add('Opera', [3472, 2933, 4203, 5229, 5810, 1828, 9013, 4669])
funnel_chart.add('Firefox', [7473, 8099, 11700, 2651, 6361, 1044, 3797, 9450])
funnel_chart.add('Chrome', [6395, 8212, 7520, 7218, 12464, 1660, 2123, 8607])
funnel_chart.render_to_file('funnel-basic.svg')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

13、SolidGauge

import pygal

gauge = pygal.SolidGauge(inner_radius=0.70)
# 百分格式
percent_formatter = lambda x: '{:.10g}%'.format(x)
# 美元格式
dollar_formatter = lambda x: '{:.10g}$'.format(x)
gauge.value_formatter = percent_formatter

gauge.add('Series 1', [{'value': 225000, 'max_value': 1275000}],
          formatter=dollar_formatter)
gauge.add('Series 2', [{'value': 110, 'max_value': 100}])
gauge.add('Series 3', [{'value': 3}])
gauge.add(
    'Series 4', [
        {'value': 51, 'max_value': 100},
        {'value': 12, 'max_value': 100}])
gauge.add('Series 5', [{'value': 79, 'max_value': 100}])
gauge.add('Series 6', 99)
gauge.add('Series 7', [{'value': 100, 'max_value': 100}])
gauge.render_to_file('solidgauge-normal.svg')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

14、ゲージ

機器チャート

import pygal

gauge_chart = pygal.Gauge(human_readable=True)
gauge_chart.title = 'DeltaBlue V8 benchmark results'
gauge_chart.range = [0, 10000]
gauge_chart.add('Chrome', 8212)
gauge_chart.add('Firefox', 8099)
gauge_chart.add('Opera', 2933)
gauge_chart.add('IE', 41)
gauge_chart.render_to_file('gauge-basic.svg')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

15、地図

世界地図

インストールする

pip install pygal_maps_world

国々

import pygal

worldmap_chart = pygal.maps.world.World()
worldmap_chart.title = 'Some countries'
worldmap_chart.add('C countries', ['cn', 'ca', 'ch', 'cg'])
worldmap_chart.add('F countries', ['fr', 'fi'])
worldmap_chart.add('M countries', ['ma', 'mc', 'md', 'me', 'mg',
                                   'mk', 'ml', 'mm', 'mn', 'mo',
                                   'mr', 'mt', 'mu', 'mv', 'mw',
                                   'mx', 'my', 'mz'])
worldmap_chart.add('U countries', ['ua', 'ug', 'us', 'uy', 'uz'])
worldmap_chart.render_to_file('world-map-countries.svg')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

16、大陸

大陸を訪問

import pygal

supra = pygal.maps.world.SupranationalWorld()
supra.add('Asia', [('asia', 1)])
supra.add('Europe', [('europe', 1)])
supra.add('Africa', [('africa', 1)])
supra.add('North america', [('north_america', 1)])
supra.add('South america', [('south_america', 1)])
supra.add('Oceania', [('oceania', 1)])
supra.add('Antartica', [('antartica', 1)])
supra.render_to_file('world-map-continents.svg')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

3、サイコロを投げる

ポイント確率を分析してヒストグラムを描く

1.ソースファイルを作成する(参照用に必要)

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)

2.サイコロを作る

from Pygal.示例.die import Die
import pygal
# 创建一个色子
die = Die()

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

print(results)

# 分析结果
frequencies = []
for value in range(1, die.num_sides+1):
    frequency = results.count(value)
    frequencies.append(frequency)

print(frequencies)

# 对结果进行可视化
hist = pygal.Bar()
hist.title='掷色子1000次的结果'
hist.x_labels = ['1','2','3','4','5','6']
hist.x_title='Result'
hist.y_title='概率'

hist.add('D6',frequencies)
hist.render_to_file('die_visual.svg')

ブラウザでファイルを開き、データにマウスを合わせると、タイトル「D6」が表示され、x軸座標とy軸座標が表示されます。

6つの数値の頻度はほぼ同じであることがわかります(理論的には確率は1/6であり、実験数の増加に伴い、傾向はますます明白になります)。

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

3. 2つのサイコロを同時に振る

コードを少し変更して、サイコロをインスタンス化するだけです

from Pygal.示例.die import Die
import pygal
# 创建两个色子
die_1 = Die()
die_2 = Die()

# 掷几次色子,并且将结果存储在一个列表中
results = []
for roll in range(1000):
    r = die_1.roll() + die_2.roll()
    results.append(r)
print(results)

# 分析结果
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)

print(frequencies)

# 对结果进行可视化
hist = pygal.Bar()
hist.title='掷色子1000次的结果'
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12']
hist.x_title='Result'
hist.y_title='概率'

hist.add('D6 + D6',frequencies)
hist.render_to_file('die_visualc.svg')****

図から、2つのサイコロの合計が7で、合計が2であることがわかります。2->(1、1)を振れるケースは1つだけなので、7を振るケースは(1、6)、(2、5)、(3、4)、(4、3)、( 5、2)、(6、1)合計6ケースあり、残りの数は7と少ないため、7をスローする確率が最も高くなります。

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

4. 2つのサイコロを同時に投げる(6と10)

from Pygal.示例.die import Die
import pygal
# 创建两个色子
die_1 = Die()
die_2 = Die(10)

# 掷几次色子,并且将结果存储在一个列表中
results = []
for roll in range(50000):
    r = die_1.roll() + die_2.roll()
    results.append(r)
print(results)

# 分析结果
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)

print(frequencies)

# 对结果进行可视化
hist = pygal.Bar()
hist.title='掷色子1000次的结果'
# hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16']
hist.x_labels = [i for i in range(2,max_result+1)]
hist.x_title='Result'
hist.y_title='概率'
hist.add('D6 + D6',frequencies)
hist.render_to_file('die_visualcc.svg')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

4、Python処理のcsvファイル

CSV(カンマ区切り値)はカンマ区切り値で、Excelで開いて表示できます。プレーンテキストであるため、任意のエディターを開くことができます。Excelファイルとは異なり、CSVファイルでは:

  • 値にはタイプがなく、すべての値は文字列です
  • フォントの色などのスタイルは指定できません
  • セルの幅と高さを指定できず、セルを結合できません
  • 複数のシートはありません
  • 画像チャートを埋め込めません

CSVファイルでは、,2つのセルを区切るセパレーターとして使用ますこの方法ではa,,c、細胞を表しa、セルは、cセル間の空白があります。等々。

すべてのコンマがセル間の境界を表すわけではありません。したがって、CSVがプレーンテキストファイルであっても、特別なモジュールを使用して処理することを要求します。Pythonには組み込みのcsvモジュールがあります。最初に簡単な例を見てください。

1. CSVファイルからデータを読み取る

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    print(list(reader))

**data直接印刷することはできません。リスト(データ)の最も外側のレイヤーはリストです。内側のレイヤーのデータの各行はリストに含まれています。

[['name', 'age'], ['Bob', '14'], ['Tom', '23'], ...]

したがってreader[1][1]このようにボブの年齢にアクセスできます。for ループで次のようにトラバースします。

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    for row in reader:
        # 行号从1开始
        print(reader.line_num, row)
出力の一部を傍受
1 ['AKST', 'Max TemperatureF]
2 ['2014-1-1', '46', '42', '37', '40', '38', '36', '97', 138']
...

前の数字は行番号で、1からreader.line_num取得できます

リーダーは一度だけトラバースできることに注意してください。readerは反復可能なオブジェクトなので、このnextメソッドを使用して一度に1行を取得できます

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    # 读取一行,下面的reader中已经没有该行了
    head_row = next(reader)
    for row in reader:
        # 行号从2开始
        print(reader.line_num, row)

2. csvファイルにデータを書き込む

読むべき読者がいて、もちろん書くべきライターがあります。一度に1行ずつ書き込み、一度に複数行を書き込みます。

import csv

# 使用数字和字符串的数字都可以
datas = [['name', 'age'],
         ['Bob', 14],
         ['Tom', 23],
        ['Jerry', '18']]

with open('example.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in datas:
        writer.writerow(row)

    # 还可以写入多行
    writer.writerows(datas)

指定しない場合newline=''、書き込まれた行ごとに空白行が書き込まれます。上記のコードは以下を生成します。

name,age
Bob,14
Tom,23
Jerry,18
name,age
Bob,14
Tom,23
Jerry,18

3. DictReaderおよびDictWriterオブジェクト

DictReaderを使用して、テーブルの最初の行(通常はヘッダー)をキーとして使用して、辞書のようなデータを取得します。各行の特定のキーに対応するデータにアクセスできます。

import csv

filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.DictReader(f)
    for row in reader:
        # Max TemperatureF是表第一行的某个数据,作为key
        max_temp = row['Max TemperatureF']
        print(max_temp)

DictWriterクラスを使用すると、ディクショナリの形式でデータを書き込むことができ、キーはヘッダー(テーブルの最初の行)でもあります。

import csv

headers = ['name', 'age']

datas = [{'name':'Bob', 'age':23},
        {'name':'Jerry', 'age':44},
        {'name':'Tom', 'age':15}
        ]

with open('example.csv', 'w', newline='') as f:
    # 标头在这里传入,作为第一行数据
    writer = csv.DictWriter(f, headers)
    writer.writeheader()
    for row in datas:
        writer.writerow(row)

    # 还可以写入多行
    writer.writerows(datas)

4.毎月の最高気温を数える

import csv
from matplotlib import pyplot as plt
from datetime import datetime

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

filename = 'Python-sitka_weather_2014.csv'
with open(filename) as f:
    # 调用reader()函数,将f对象作为参数传递给它,从而创建一个与该文件相关联的阅读器对象
    reader = csv.reader(f)
    # 返回文件中的下一行
    header_row = next(reader)
    # print(header_row)

    # for index, column_header in enumerate(header_row):
    #     print(index, column_header)

    highs = []
    for row in reader:
        # 使用int()将字符串转换为数字,让matplotlib能够读取它们
        high = int(row[1])
        highs.append(high)

    print(highs)

    # 根据数据绘制图形
    fig = plt.figure(dpi=128, figsize=(16, 9))
    plt.plot(highs, c='red')

    # 设置图形格式
    plt.title('2014年最高气温', fontsize=24)
    plt.xlabel('', fontsize=16)
    plt.ylabel('最高气温', fontsize=16)
    plt.tick_params(axis='both', which='major', labelsize=16)

    plt.show()

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

5.毎月の最高気温と最低気温を数える

import csv
from matplotlib import pyplot as plt
from datetime import datetime

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

filename = 'Python-sitka_weather_2014.csv'
with open(filename) as f:
    # 调用reader()函数,将f对象作为参数传递给它,从而创建一个与该文件相关联的阅读器对象
    reader = csv.reader(f)
    # 返回文件中的下一行
    header_row = next(reader)
    # print(header_row)

    dates, highs, lows = [], [], []
    for row in reader:
        current_date = datetime.strptime(row[0], "%Y/%m/%d")
        dates.append(current_date)
        # print(current_date)

        # 使用int()将字符串转换为数字,让matplotlib能够读取它们
        high = int(row[1])
        highs.append(high)

        low = int(row[3])
        lows.append(low)

    # print(highs)

    # 根据数据绘制图形
    fig = plt.figure(dpi=128, figsize=(16, 9))
    plt.plot(dates, highs, c='red', alpha=0.5)
    plt.plot(dates, lows, c='blue', alpha=0.5)
    plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)

    # 设置图形格式
    plt.title('2014年最高气温', fontsize=24)
    plt.xlabel('', fontsize=16)
    # 绘制斜线标签
    fig.autofmt_xdate()
    plt.ylabel('最高气温', fontsize=16)
    plt.tick_params(axis='both', which='major', labelsize=16)

    plt.show()
    # plt.savefig('hish.png')

Pythonデータの視覚化(Pygal、svg、csv、Bar、Line)

おすすめ

転載: blog.51cto.com/14320361/2486440