Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

《利用Python进行数据分析》读书笔记-8-第八章-绘图和可视化

阅读数:次 2017-04-20
字数统计: 1.9k字   |   阅读时长≈ 10分

matplotlib API入门

Figure 和 Subplot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import matplotlib.pyplot as plt

## Figure 和 Subplot
# matplotlib的图像都位于Figure对象中,构建新对象
fig = plt.figure()
# 不能通过Figure绘图,必须用add_subplot创建一个或多个subplot才行
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
plt.show()
# 这三个是表示图像是2*2的,当前占编号1,2,3位

plt.plot([1.5,3.5,-2,1.6])

from numpy.random import randn
plt.plot(randn(50).cumsum(), 'k--')
plt.show()
# "k--"线型选项,黑色虚线图

# 随机柱状图,20柱,每柱间隔0.3
_ = ax1.hist(randn(100), bins=20, color='k', alpha=0.3)
# 随机散点图,30个点
ax2.scatter(np.arange(30), np.arange(30) + 3 * randn(30))
# plt.show()

颜色、标记和线型

1
2
3
4
plt.plot(randn(30).cumsum(), 'ko--')
# 等价于以下明确形式:R
# plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='0')
plt.show()

图8-6带有标记的线型图

刻度、标签和图例

xlim xticks xticklabels
范围 刻度位置 刻度标签

标题、轴标签、刻度以及刻度标签

1
2
3
4
5
fig = plt.figure(); ax = fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum())
ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')
plt.show()

图8-8 用于演示xticks的简单线形图

添加图例

1
2
3
4
5
6
7
# 方式一:传入参数label
fig = plt.figure(); ax = fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum(), 'k', label='one')
ax.plot(randn(1000).cumsum(), 'k--', label='two')
ax.plot(randn(1000).cumsum(), 'k.', label='three')
ax.legend(loc='best') # 添加图例
plt.show()

图8-8 用于演示xticks的简单线形图

图注解以及在Subplot上绘图

1
2
3
4
5
6
7
8
9
10
11
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# 创建块对象
rect = plt.Rectangle((0.2,0.75),0.4,0.15,color='k',alpha=0.3)
circ = plt.Circle((0.7,0.2),0.15,color='b',alpha=0.3)
pgon = plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color='g',alpha=0.5)
# ax.add_patch(shp) 添加到subplot中
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
plt.show()

图8-12 由三个块图形组成的图

将图标保存到文件

1
2
3
4
5
6
7
8
9
10
plt.savefig('figpath.svg')
plt.savefig('figpath.pdf')
# # dpi-分辨率,bbox_inches-剪除图标周围空白部分
plt.savefig('figpath.png', dpi=400, bbox_inches= 'tight')
# 以上都是存到磁盘,也可以存入文件型对象
from io import StringIO
buffer = StringIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
# 对在Web上提供生成的图片很实用

matplotlib配置

1
2
3
4
5
6
7
# 如设置图像大小
plt.rc('figure', figsize=10*10)
# 关键字参数,写成字典
font_options = {'family': 'monospace',
'weight': 'bold',
'size': 'small'}
plt.rc('font', **font_options)

pandas中的绘图函数

线形图

简单Series图表

1
2
3
4
5
from pandas import Series
from pandas import DataFrame
s = Series(np.random.randn(10).cumsum(), index=np.arange(0,100,10))
s.plot()
plt.show()

图8-13 简单Series图表

简单的DataFrame图表

1
2
3
df = DataFrame(np.random.randn(10,4).cumsum(0), columns=['A','B','C','D'],index=np.arange(0,100,10))
df.plot()
plt.show()

图8-14 简单的DataFrame图表

柱状图

1
2
3
4
5
6
# kind="bar"(垂直柱状图),kind="barh"(水平柱状图)
fig, axes = plt.subplots(2, 1)
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot(kind='bar', ax=axes[0],color='k', alpha=0.7)
data.plot(kind='barh', ax=axes[1],color='k', alpha=0.7)
plt.show()

图8-15 水平和垂直柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
df = DataFrame(np.random.rand(6,4), index=['one', 'two', 'three', 'four', 'five', 'six'],
columns=pd.Index(['A','B','C','D'],name='Genus'))

# print df
# Genus A B C D
# one 0.465771 0.579470 0.053485 0.863450
# two 0.550022 0.855826 0.967881 0.792683
# three 0.666868 0.536417 0.245592 0.839482
# four 0.439348 0.676450 0.637932 0.106940
# five 0.606376 0.609878 0.498459 0.010276
# six 0.923550 0.243204 0.422216 0.979446

df.plot(kind='bar')
plt.savefig('图8-16 DataFrame柱状图')
# plt.show()
# 设置stacked=True生成DataFrame的堆积柱状图,每行都堆积在一起
df.plot(kind='barh', stacked=True, alpha=0.5)
plt.savefig('图8-17 DataFrame堆积柱状图')
# plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
tips = pd.read_csv('../pydata-book-master/ch08/tips.csv')
party_counts = pd.crosstab(tips.day, tips.size)
# print party_counts
# col_0 1708
# day
# Fri 19
# Sat 87
# Sun 76
# Thur 62

party_counts = party_counts.ix[:, 2:5]
print party_counts

实战:绘制地图-图形化显示海地地震危机数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
data = pd.read_csv('../pydata-book-master/ch08/Haiti.csv')
# print data
# 拿出时间戳和位置信息
# print data[['INCIDENT DATE', 'LATITUDE', 'LONGITUDE']][:10]
# INCIDENT DATE LATITUDE LONGITUDE
# 0 05/07/2010 17:26 18.233333 -72.533333
# 1 28/06/2010 23:06 50.226029 5.729886
# 2 24/06/2010 16:21 22.278381 114.174287
# 3 20/06/2010 21:59 44.407062 8.933989
# 4 18/05/2010 16:26 18.571084 -72.334671
# 5 26/04/2010 13:14 18.593707 -72.310079
# 6 26/04/2010 14:19 18.482800 -73.638800
# 7 26/04/2010 14:27 18.415000 -73.195000
# 8 15/03/2010 10:58 18.517443 -72.236841
# 9 15/03/2010 11:00 18.547790 -72.410010

# 消息类型
# print data['CATEGORY'][:6]
# 0 1. Urgences | Emergency, 3. Public Health,
# 1 1. Urgences | Emergency, 2. Urgences logistiqu...
# 2 2. Urgences logistiques | Vital Lines, 8. Autr...
# 3 1. Urgences | Emergency,
# 4 1. Urgences | Emergency,
# 5 5e. Communication lines down,
# Name: CATEGORY, dtype: object

# 异常的地理位置
# print data.describe()
# Serial LATITUDE LONGITUDE
# count 3593.000000 3593.000000 3593.000000
# mean 2080.277484 18.611495 -72.322680
# std 1171.100360 0.738572 3.650776
# min 4.000000 18.041313 -74.452757
# 25% 1074.000000 18.524070 -72.417500
# 50% 2163.000000 18.539269 -72.335000
# 75% 3088.000000 18.561820 -72.293570
# max 4052.000000 50.226029 114.174287

# 清除错误位置信息并移除缺失分类信息:
data = data[(data.LATITUDE > 18) & (data.LATITUDE < 20) &
(data.LONGITUDE > -75) & (data.LONGITUDE < -70)
& data.CATEGORY.notnull()]

# 编写函数获取所有分类的列表,将各个分类信息拆分为编码和英语名称
def to_cat_list(catstr):
stripped = (x.strip() for x in catstr.split(','))
return [x for x in stripped if x]

def get_all_categories(cat_series):
cat_sets = (set(to_cat_list(x)) for x in cat_series)
return sorted(set.union(*cat_sets))

def get_english(cat):
code, names = cat.split('.')
if '|' in names:
names = names.split(' | ')[1]
return code, names.strip()

# 测试get_english是否正常
# print get_english('2. Urgences logistiques | Vital Lines')
# ('2', 'Vital Lines')

all_cats = get_all_categories(data.CATEGORY)
# 生成器表达式
english_mapping = dict(get_english(x) for x in all_cats)

# print english_mapping['2a']
# Food Shortage

# print english_mapping['6c']
# Earthquake and aftershocks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 抽取分类编码,构造全0DataFrame
def get_code(seq):
return [x.split('.')[0] for x in seq if x]

all_codes = get_code(all_cats)
code_index = pd.Index(pd.unique(all_codes))
dummy_frame = DataFrame(np.zeros((len(data), len(code_index))), index=data.index, columns=code_index)
# print dummy_frame.ix[:, :6]
# 1 1a 1b 1c 1d 2
# 0 0.0 0.0 0.0 0.0 0.0 0.0
# 4 0.0 0.0 0.0 0.0 0.0 0.0
# 5 0.0 0.0 0.0 0.0 0.0 0.0
# 6 0.0 0.0 0.0 0.0 0.0 0.0
# 7 0.0 0.0 0.0 0.0 0.0 0.0
# 8 0.0 0.0 0.0 0.0 0.0 0.0
# 9 0.0 0.0 0.0 0.0 0.0 0.0
# 10 0.0 0.0 0.0 0.0 0.0 0.0

for row, cat in zip(data.index, data.CATEGORY):
codes = get_code(to_cat_list(cat))
dummy_frame.ix[row, codes] = 1

data = data.join(dummy_frame.add_prefix('category_'))
# print data.ix[:,10:15]
# category_1 category_1a category_1b category_1c category_1d
# 0 1.0 0.0 0.0 0.0 0.0
# 4 1.0 0.0 0.0 0.0 0.0
# 5 0.0 0.0 0.0 0.0 0.0
# 6 0.0 0.0 0.0 0.0 0.0
# 7 0.0 0.0 0.0 0.0 0.0
# 8 0.0 0.0 0.0 0.0 0.0
# 9 0.0 0.0 0.0 0.0 0.0
# 10 0.0 1.0 0.0 0.0 0.0

# Python绘制地图依赖于basemap工具集(http://matplotlib.github.com/basemap)插件
# 绘制黑白海地地图
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

def basic_haiti_map(ax=None, lllat=17.25, urlat=20.25, lllon=-75, urlon=-71):
# 创建极球面投影的Basemap实例
m = Basemap(ax=ax, projection='stere',
lon_0=(urlon + lllon) / 2,
lat_0=(urlat + lllat) / 2,
llcrnrlat=lllat, urcrnrlat=urlat,
llcrnrlon=lllon, urcrnrlon=urlon,
resolution='f')

# 绘制海岸线、州届、国界以及地图边界
m.drawcoastlines()
m.drawstates()
m.drawcountries()
return m

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 10))
fig.subplots_adjust(hspace=0.05, wspace=0.05)

to_plot = ['2a', '1', '3c', '7a']
lllat = 17.25;urlat = 20.25;lllon = -75;urlon = -71

for code, ax in zip(to_plot, axes.flat):
m = basic_haiti_map(ax, lllat=lllat, urlat=urlat, lllon=lllon, urlon=urlon)
cat_data = data[data['category_%s' % code] == 1]
# 计算地图的投影坐标
x, y = m(cat_data.LONGITUDE, cat_data.LATITUDE)

m.plot(x, y, 'k.', alpha=0.5)
ax.set_title('%s: %s' % (code, english_mapping[code]))
  • 本文作者: Linking
  • 本文链接: https://linking.fun/2017/04/20/《利用Python进行数据分析》读书笔记-8-第八章-绘图和可视化/
  • 版权声明: 版权所有,转载请注明出处!
  • Python
  • cs

扫一扫,分享到微信

program常用标识
《利用Python进行数据分析》读书笔记-7-第七章-数据规整化:清理、转换、合并与重塑
  1. 1. matplotlib API入门
    1. 1.1. Figure 和 Subplot
  2. 2. pandas中的绘图函数
    1. 2.1. 线形图
    2. 2.2. 柱状图
  3. 3. 实战:绘制地图-图形化显示海地地震危机数据
© 2015-2026 Linking
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 外链

tag:

  • weather
  • 需求
  • essay
  • basketball
  • olympic
  • nginx
  • APPScan
  • SQl盲注
  • xss
  • Ajax
  • ajax
  • ai
  • agent
  • openclaw
  • ccf
  • Nginx
  • HTML5
  • html5
  • hmtl5
  • sse
  • JavaScriptCore
  • Oracle
  • operation
  • Linux
  • deploy
  • Mac Office
  • markdown
  • ListView
  • GridView
  • MySQL
  • 慢查询
  • mongodb
  • 转置
  • thought
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • avatar
  • cocoa
  • blog
  • Gitalk
  • container
  • macvlan
  • docker
  • oracle
  • cookie
  • patch
  • gitea
  • git
  • iOS
  • https
  • 多线程
  • bundle
  • 兼容性
  • HTTP
  • 绘图
  • cs
  • java
  • 效率
  • 快捷键
  • route
  • nodejs
  • pip
  • arcgis
  • arcgis 建模
  • 标识
  • redis
  • read
  • bookList
  • running
  • showdoc
  • disk
  • unit-test
  • D.Wade
  • thoughts
  • duoduo
  • Python
  • python
  • tomcat
  • 读书节
  • session
  • jdk
  • war
  • 加班
  • Android onclick事件监听
  • 正则
  • 手机品牌匹配
  • ntp
  • OpenLayers
  • Geoserver
  • wechat
  • 微信公众号
  • 爬虫
  • WeChat
  • 张靓颖
  • 动漫
  • vpn
  • PPT
  • MarkDown
  • plan
  • 朱赟
  • 极客时间专栏
  • 极客邦
  • 模块化
  • MVC
  • excel
  • NBA
  • kobe
  • team
  • crawler
  • 进度条
  • ssl
  • book
  • anti-stealing-link
  • Agentic Engineering
  • Vibe Coding
  • Software 3.0
  • Andrej Karpathy
  • LLM
  • Programming

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • GitHub Trending
  • OpenAI ChatGPT
  • Gitee码云
  • 简书
  • CSDN