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")
画像を表示するには、ソースファイルを表示する必要があります。
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")
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")
5.上のチャートのレベルを設定します(HorizontalStackedBar)
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")
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")
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")
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")
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")
ラムダは式または無名関数です
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")
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")
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")
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")
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")
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")
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")
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')
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')
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')
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')
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')
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であり、実験数の増加に伴い、傾向はますます明白になります)。
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をスローする確率が最も高くなります。
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')
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()
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')