数据可视化 Python Matplotlib Plotly
1.Matplotlib
1.安装Matplotlib
$ python -m pip install --user matplotlib
2.Matplotlib官网
Matplotlib documentation — Matplotlib 3.8.2 documentation
3.函数
1.导入模块pyplot,指定别名plt
模块pyplot包含很多用于生成图表的函数
import matplotlib.pyplot as plt
2.subplots()
在一张图片中绘制一个或多个图表
变量fig表示整张图片。变量ax表示图片中的各个图表。
参数figsize指定生成的图形的尺寸,单位为英寸
参数dpi传递分辨率
fig, ax = plt.subplots() fig, ax = plt.subplots(figsize=(15, 9), dpi=128)
3.plot()
根据给定的数据绘制图表
第一个参数输入值
第二个参数输出值
参数linewidth决定了plot()绘制的线条粗细。
参数alpha指定颜色的透明度。alpha值为0表示完全透明,为1(默认)表示完全不透明
参数c指定颜色
ax.plot(input_values, squares, linewidth=3) ax.plot(dates, lows, c='blue', alpha=0.5)
4.show()
打开Matplotlib查看器并显示绘制的图表
plt.show()
5.set_title()
给图表指定标题
参数fontsize指定图表中文字大小,6,7同
ax.set_title("Square number", fontsize=24)
6.set_xlabel()
x轴设置标题
ax.set_xlabel("value", fontsize=14)
7.set_ylabel()
y轴设置标题
ax.set_ylabel("value's Square number", fontsize=14)
8.tick_params()
设置刻度样式
参数axis影响x轴和y轴的刻度
参数labelsize指定刻度标记的字号
ax.tick_params(axis='both', labelsize=14)
9.scatter()
向它传递1一对x坐标和y坐标,它在指定位置绘制一个点
参数s设置点的尺寸
绘制一系列的点向它传递两个分别包含x值和y值的列表
参数c设置要使用的颜色
颜色名称(放在引号内)
RGB模式自定义颜色,包含三个0~1的小数值,分别表示红色、绿色和蓝色的分量(放在括号内)
颜色映射:从起始颜色渐变到结束颜色
参数c设置成一个y值列表,使用参数cmap告诉pyplot使用哪个颜色映射
参数edgecolors='none'删除每个点周围的轮廓
ax.scatter(x_values, y_values, c='red', s=10) ax.scatter(x_values, y_values, c=(0, 0.8, 0), s=10) ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=10) ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors='none', s=1)
10.axis()
指定每个坐标轴的取值范围,分别为x和y轴的最小值和最大值
ax.axis([0, 1100, 0, 1100000])
11.get_xaxis()和get_yaxis()
将每条坐标轴的可见性都设置为False
ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False)
12.autofmt_xdate()
绘制倾斜的日期标签,以免其彼此重叠
fig.autofmt_xdate()
13.fill_between()
接受一个x值系列和两个y值系列,并填充两个y值系列之间的空间
参数alpha指定颜色的透明度。alpha值为0表示完全透明,为1(默认)表示完全不透明
实参facecolor指定填充区域的颜色
ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
4.获取系统中Matplotlib可使用的样式
终端输入
$ python >> import matplotlib.pyplot as plt >> plt.style.available
使用样式在生成图表的代码前添加
plt.style.use('seaborn-v0_8')
5.自动保存图表
plt.savefig('squares_plot.png', bbox_inches='tight')
第一个参数文件名,第二个参数指定将图表多余的空白区域裁剪掉。
2.Plotly
1.安装Plotly
Plotly提供了根据位置数据绘制地图的工具。在Plotly中,将鼠标指向条形将显示其表示的信息,通常称为工具提示。Plotly允许在文本元素中使用HTML代码。
$ python -m pip install --user plotly
2.Plotly官网
Plotly Python Graphing Library
3.函数和类
1.导入Bar, Layout,offline
from plotly.graph_objs import Bar, Layout from plotly import offline
2.类Bar()
用于绘制条形图的数据集,需要一个存储x值的列表和一个存储y值的列表,这个类必须放在方括号类,因为数据集可能包含多个元素。
Plotly不能直接接受函数range()的结果,用函数list()转换为列表
x_values = list(range(2, max_result+1)) data = [Bar(x=x_values, y=frequencies)]
3.类Layout()
返回一个指定图表布局和配置的对象
title为名称
每个坐标轴以不同的方式进行配置,而每个配置选项为一个字典元素。
dtick键指定了x轴显示的刻度间距。
x_axis_config = {'title': '结果', 'dtick': 1}
y_axis_config = {'title': '结果的频率'}
my_layout = Layout(title='掷一个D6和一个D10 50 000次的结果',
xaxis=x_axis_config, yaxis=y_axis_config)
4.offline.plot()
1.生成图表
包含一个数据和布局对象的字典
还接受一个文件名,指定要将图表保存到哪里。
2.使用字典定义布局。
marker设置影响条形设计
opacity设置条形的不透明度
titlefont指定图表名称的字号
在字典'xaxis'中,titlefont指定x轴标签字号,tickfont指定刻度标签字号,还可以使用相应的键指定坐标轴标签和刻度标签的颜色和字体,y轴类似。
offline.plot({'data': data, 'layout': my_layout}, filename='d6_d10.html')
# 可视化。
data = [{
'type': 'bar',
# 'x': repo_names,
'x': repo_links,
'y': stars,
'hovertext': labels,
'marker': {
'color': 'rgb(60, 100, 150)',
'line': {'width': 1.5, 'color': 'rgb(25, 25, 25)'}
},
'opacity': 0.6,
}]
my_layout = {
'title': 'Github上最受欢迎的Python项目',
'titlefont': {'size': 28},
'xaxis': {
'title': 'Repository',
'titlefont': {'size': 24},
'tickfont': {'size': 14},
},
'yaxis': {
'title': 'Stars',
'titlefont': {'size': 24},
'tickfont': {'size': 14},
},
}
fig = {'data': data, 'layout': my_layout}
offline.plot(fig, filename='python_repos.html')
4.Plotly Express
Plotly Express是Plotly的高级接口
1.导入
import plotly.express as px
2.fig.write_html()
fig.write_html方法可以将可视化图保存为html文件
3.pandas数据分析工具
3.1.文档
Pandas: 强大的 Python 数据分析支持库 | Pandas (pypandas.cn)
3.2.导入
import pandas as pd
3.3.DataFrame()
数据封装,所有有关数据的信息都以键值对的形式放在一个字典中。
data = pd.DataFrame( data=zip(lons, lats, titles, mags), columns=['经度', '纬度', '位置', '震级'] ) data.head()
4.定制数据系列
size参数指定散点图中每个标记的尺寸。
size_max=10将最大显示尺寸缩放到10
color将标记按不同的颜色显示,默认的视觉映射图例渐变色范围是从蓝到红再到黄,数值越小标记越蓝,而数值越大则标记越黄。
hover_name指定鼠标悬浮时显示的字段
fig = px.scatter( data, x='经度', y='纬度', size='震级', size_max=10, color='震级', hover_name='位置', )
5.其他渐变
Plotly Express将渐变存储在模块colors中。这些渐变是在列表px.colors.named_colorscales()中定义的。
使用px.colors.diverging.RdYlGn[::-1]可以将对应颜色的配色列表反转。
Plotly除了有px.colors.diverging表示连续变量的配色方案,还有px.colors.sequential和px.colors.qualitative表示离散变量。
import plotly.express as px for key in px.colors.named_colorscales(): print(key)
5.深入了解Plotly
1.Plotly User Guide
通过研究该资源,可深入地了解Plotly是如何使用数据来生成可视化图表地,以及采取这种做法地原因。
2.Python Figure Reference
其中列出了可用来配置Plotly可视化的所有设置。还列出了所有地图表类型,以及在各种配置选项中可设置地属性。
3.网络数据下载
1.CSV
将数据作为一系列以逗号分隔的值写入文件称为CSV文件
1.csv模块
csv模块包含在Python标准库,用于分析CSV文件中的数据行
2.CSV文档
csv --- CSV 文件读写 — Python 3.12.0 文档
3.函数和类
1.导入csv
import csv
2.csv.reader()
创建一个与传递的文件相关联的阅读器对象
with open(filename) as f: reader = csv.reader(f)
阅读器for遍历数据
阅读器对象从其停留的地方继续往下读取CSV文件,每次都自动返回当前所处位置的下一行
for row in reader:
current_date = datetime.strptime(row[2], '%Y-%m-%d')
high = int(row[5])
low = int(row[6])
dates.append(current_date)
highs.append(high)
lows.append(low)
3.next()
传入阅读器对象时,返回文件中的下一行
header_row = next(reader)
4.错误检查
使用try-except-else代码块来处理数据缺失的问题
for row in reader:
current_date = datetime.strptime(row[2], '%Y-%m-%d')
try:
high = int(row[4])
low = int(row[5])
except ValueError:
print(f"Missing data for {current_date}")
else:
dates.append(current_date)
highs.append(high)
lows.append(low)
在有些情况下,需要使用continue来跳过一些数据,或者使用remove()或del将已提取的数据删除
5.手动下载数据
1.访问网站NOAA Climate Data Online。在Discover Data By部分,单击Search Tool。在下拉列表Select a Dataset中,选择Daily Summaries。
2.选择一个日期范围,在Search For下拉列表中ZIP Codes,输入你感兴趣地区的邮政编码,再单击Search按钮。
3.在下一个页面中,你将看到指定地区的地图和相关信息。单击地区名下方的View Full Details或单击地图再单击Full Details。
4.向下滚动并单击Station List,以显示该地区的气象站,再选择一个气象站并单击Add to Cart。虽然这个网站使用了购物车图标,但提供的数据是免费的。单击右上角的购物车。
5.在Select the Output中选择Custom GHCN-Daily CSV。确认日期范围无误后单击Continue。
6.在下一个页面中,可选择要下载的数据类型。可以只下载一种数据(如气温),也可以下载该气象站提供的所有数据。做出选择后单击Continue。
7.在最后一个页面,你将看到订单小结。请输入你的电子邮箱地址,再单击Submit Order。你将收到一封确认邮件,指出收到了你的订单。几分钟后,你将收到另一份邮件,其中包含用于下载数据的链接。
2.JSON
1.json模块
JavaScript Object Notation 【JavaScript 对象表示法】,JSON 是存储和交换文本信息的语法。
提供了各种探索和处理JSON数据的工具,其中一些有助于重新设置这个文件的格式
2.JSON文档
json --- JSON 编码和解码器 — Python 3.12.0 文档
3.函数和类
1.json.load()
将数据转换为Python能够处理的格式。
with open(filename) as f: all_eq_data = json.load(f)
2.json.dump()
接受一个JSON数据对象和一个文件对象,并将数据写入这个文件
参数indent=4让dump()使用与数据结构匹配的缩进量来设置数据的格式。
with open(readable_file, 'w') as f: json.dump(all_eq_data, f, indent=4)
GeoJSON 是一种使用JavaScript 对象表示法(JSON) 对地理数据结构进行编码的格式。简而言之,GeoJSON 为你提供了一种简单的格式来表示简单的地理特征以及它们的非空间属性。
geoJSON文件的结构适合存储基于位置的数据,遵循(经度,纬度)的约定
3.其他函数和模块
1.内置函数enumerate()
获取每个元素的索引及其值。
for index, column_header in enumerate(header_row): print(index, column_header)
2.datetime模块
1.导入datetime
from datetime import datetime
2.strptime()
字符串转换为日期对象
将包含所需日期的字符串作为第一个实参,第二个实参告诉Python如何设置日期的格式。
current_date = datetime.strptime(row[2], '%Y-%m-%d')
3.模块datetime中设置日期和时间格式的实参
%A 星期几,如Monday
%B 月份名,如January
%m 用数表示的月份(01~12)
%d 用数表示的月份中的一天(01~31)
%Y 四位的月份,如2019
%y 两位的月份,如19
%H 24小时制的小时数(00~23)
%I 12小时制的小时数(01~12)
%p am或pm
%M 分钟数(00~59)
%S 秒数(00~61)
4.使用API
1.API调用
Web API是网站的一部分,用于与使用具体URL请求特定信息的程序交互。这种请求成为API调用。请求的数据将以易于处理的格式(如JSON或CSV)返回。
本次编写程序自动下载Github上星级最高的Python项目的信息,并对这些信息进行可视化。
2.Github的API
api.github.com/search/repositories?q=language:python&sort=stars
这个调用返回Github当前托管了多少个Python项目,以及有关最受欢迎的Python仓库的信息。
开头的https://api.github.com/将请求发送到Github网站中响应API调用的部分,接下来的search/repositories让API搜索Github上的所有仓库。repositories后面的问号指出需要传递一个实参。q表示查询,而等号(=)让我们能够开始指定查询。我们使用language:python指出只想获取主要语言为Python的仓库的信息。最后的&sort=stars指定将项目按星级排序。
3.Requests
Requests包让Python程序能够轻松地向网站请求信息并检查返回地响应。
1.安装Requests
$ python -m pip install --user requests
2.导入
import requests
3.调用API
headers显式地要求使用哪个版本地API
get()返回响应对象,包含status_code属性,指出请求是否成功(状态码200表示请求成功)
当前API返回JSON格式的信息,使用json()将这些信息转换为一个Python字典
url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
headers = {'Accept': 'application/vnd.github.v3+json'}
r = requests.get(url, headers=headers)
print(f"Status code: {r.status_code}")
response_dict = r.json()
4.监视API的速率限制
大多数API限制速率,即在特定时间内可执行的请求数存在限制。
要获悉是否接近了GitHub的限制,可查看api.github.com/rate_limit
"search"项为搜索API的速率限制,其中"limit"项为每分钟请求限制,"reset"值指的是配额将重置的Unix时间或新纪元时间(1970年1月1日午夜后多少秒)。用完配额后,会收到一条简单的响应,由此知道已到达API极限。到达极限后,必须等待配额重置。
很多API要求注册获得API密钥后才能执行API调用。
5.Hacker News
1.Hacker News网址
2.Hacker News API
HackerNews/API: Documentation and Samples for the Official HN API (github.com)
6.其他函数和模块
1.sorted()
内置函数,sorted() 函数对所有可迭代的对象进行排序操作。
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
sorted 语法:
sorted(iterable, cmp=None, key=None, reverse=False)
参数说明:
iterable -- 可迭代对象。 cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。 key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值 返回重新排序的列表。
submission_dicts = sorted(submission_dicts, key=itemgetter('comments'),
reverse=True)
2.operator模块
1.itemgetter()
获取指定域中的值。
submission_dicts = sorted(submission_dicts, key=itemgetter('comments'),
reverse=True)