文章数据
收藏(次)
【python数据分析】第九章 绘图和可视化
绘图使用 matplotlib
--------------------------------------------------------------------------------
import numpy as np
import pandas as pd
import matplotlib as plt # 这里和书上引包不同,书上那种我这里有一个警告,所以使用这个
--------------------------------------------------------------------------------
# 再 jupter notebook 上运行,会让绘图有更多操作,比如还有保存按钮
# 当然不执行也可以,不会影响绘图的
%matplotlib notebook
data = np.arange(10)
plt.pyplot.plot(data)
--------------------------------------------------------------------------------
绘图需要有画板。然后绘制,上面的代码 plt.pyplot.plot(data) 其实在内部执行了2个动作,
创建画板和绘制,plt.pyplot.plot(data) 绘制时会使用最后一个画板,如果没有才会创建
--------------------------------------------------------------------------------
fig = plt.pyplot.figure() # 相当于生成一个画板, 有画板不能画,加一张背景
ax1 = fig.add_subplot(2,2,1) # 画板很大,可以分割的,这里我们分割2*2,可以画四张图,当前时 1
ax2 = fig.add_subplot(2,2,2) # 这句话就相当于加一个背景, 这时 axi2 上面可以画图了
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
现在分割成 4 块,而且屏幕上已经展示了 4 块空白区域
plt.pyplot.plot(np.random.randn(50).cumsum(), 'k--') # 开始画图,找最后一个画板,结果话在第四个上
"k--"是一个线型选项,用于告诉matplotlib绘制黑色虚线图
总是再最后一个操作的 画板上绘制,这可不行,要能指定再哪里画,
# 在 第1块画布上画直方图
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
# 在 第2块画布上画散列图
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
--------------------------------------------------------------------------------
上面的又是画板,又是画布的,麻烦?
subplots 方法是一个快速创建,返回两个参数,一个大的画板,一个是里面小的背景画布
fig, axes = plt.pyplot.subplots(2,3)
获取某个画布 axes[0,1] 即可了
--------------------------------------------------------------------------------
plt.pyplot.subplots(
nrows=1, # subplot 行数
ncols=1, # 列数
sharex=False, # 所有subplot应该使用相同的 X 轴刻度
sharey=False, # 使用统一的 y 刻度
squeeze=True, # 关键字字典
subplot_kw=None,
gridspec_kw=None,
**fig_kw, # 其他关键字 figsize=(8,6)
)
--------------------------------------------------------------------------------
调整subplot周围的间距
plt.pyplot.subplots_adjust(wspace=0, hspace=0) # 虽然图已经画出来了,他能动态改边距
--------------------------------------------------------------------------------
fig, axes = plt.pyplot.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
for j in range(2):
axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.pyplot.subplots_adjust(wspace=0, hspace=0)
================================================================================
颜色、标记和线型
--------------------------------------------------------------------------------
plt.pyplot.plot(data)
颜色g(绿), k(黑色??) , 也能指定 #ff5555
linestyle='--',
plt.pyplot.subplots()
plt.pyplot.plot(np.random.randn(30).cumsum(), 'ko--')
--------------------------------------------------------------------------------
plt.pyplot.subplots()
plt.pyplot.plot(np.random.randn(30).cumsum(), color='k', linestyle='dashed', marker='o' )
--------------------------------------------------------------------------------
样子出来,至于是什么,还不清楚
data = np.random.randn(30).cumsum()
plt.pyplot.subplots()
plt.pyplot.plot(data, 'k-', label='Default')
plt.pyplot.plot(data, 'k--', drawstyle='steps-post', label='画一张' )
plt.pyplot.legend(loc='best')
================================================================================
刻度、标签和图例
--------------------------------------------------------------------------------
fig = plt.pyplot.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
ticks = ax.set_xticks([0, 250, 500, 750, 1000]) # 改掉原来的刻度,使用这个刻度
#刻度改变为下面的文字,旋转30度
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
rotation=30, fontsize='small')
ax.set_title('My first matplotlib plot') # 设置 title
ax.set_xlabel('Stages') # 设置 label
props = {
'title': 'My first matplotlib plot',
'xlabel': 'Stages'
}
ax.set(**props)
--------------------------------------------------------------------------------
fig = plt.pyplot.figure();
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum(), 'k', label='one')
ax.plot(np.random.randn(1000).cumsum(), 'k--', label='two')
ax.plot(np.random.randn(1000).cumsum(), 'k.', label='three')
ax.legend(loc='best')
================================================================================
注解以及在Subplot上绘图
--------------------------------------------------------------------------------
ax.text(x, y, 'Hello world!', family='monospace', fontsize=10) # 添加文件
ax.annotate() # 添加注解
--------------------------------------------------------------------------------
我们使用 set_xlim 和set_ylim人工设定起始和结束边界
ax.set_xlim 设置x的起始和结束值,中间的就让他自动取值
ax.set_ylim 设置y的起始和结束值,中间的让他自动取值
ax.set_title
--------------------------------------------------------------------------------
fig = plt.pyplot.figure()
ax = fig.add_subplot(1, 1, 1)
rect = plt.pyplot.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
circ = plt.pyplot.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
pgon = plt.pyplot.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]], color='g', alpha=0.5)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
================================================================================
将图表保存到文件
--------------------------------------------------------------------------------
plt.pyplot.savefig('fig.svg') # 保存左后操作的 plt 图像到文件
plt.pyplot.savefig('figpath.png', dpi=400, bbox_inches='tight') # 同上
--------------------------------------------------------------------------------
savefig并非一定要写入磁盘,也可以写入任何文件型的对象,比如BytesIO:
from io import BytesIO
buffer = BytesIO()
plt.pyplot.savefig(buffer)
plot_data = buffer.getvalue()
--------------------------------------------------------------------------------
savefig 的参数:
fname, 可有后缀推断文件类型
dpi 图像分辨率,默认100
facecolor, edgecolor 背景颜色
format 格式
bbox_inches 需要保存的部分,如果设置成 tight, 则将会尝试减除周围空白的部分
================================================================================
配置:
plt.rc('figure', figsize=(10, 10)) # 要将全局的图像默认大小设置为10×10
设置全局字体:
font_options = {'family' : 'monospace','weight' : 'bold','size' : '16'}
plt.pyplot.rc('font', **font_options)
================================================================================
使用pandas和seaborn绘图
================================================================================
s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
--------------------------------------------------------------------------------
s.ploy() 的参数可不少啊
--------------------------------------------------------------------------------
参数介绍:
label 图例的标签
ax 要绘制的画板上的一块画布
style 风格,比如 'ko--'
alpha
kind line bar barh kde
logy y轴上使用对数标尺
use_index 使用对象的索引作为刻度标签
rot 旋转标签刻度
xticks x 的刻度值
yticks
xlim x的界限 比如 [0,100]
ylim
grid 显示网格线
下面这些参数专门用于 DataFrame的 df.plot()?????
subplots 每一列单独绘制到一个画布上
sharex 多个图是否使用同一个X刻度
shareY
figsize 大小的元组
title 标题 不要出现中文字符
legend 添加一个图例
sort_columns 以字母表顺序绘制各表
--------------------------------------------------------------------------------
df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
columns=['A', 'B', 'C', 'D'],
index=np.arange(0, 100, 10)
)
fig = plt.pyplot.figure()
ax = fig.add_subplot(1, 1, 1)
df.plot(ax=ax)
================================================================================
直方图:
jupter画图不显示,代码没有报错,可能时 %matplotlib notebook 没有先执行一下
fig, axes = plt.pyplot.subplots(2, 1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)
--------------------------------------------------------------------------------
df = pd.DataFrame(np.random.rand(6, 4),
index=['one', 'two', 'three', 'four','five', 'six'],
columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df.plot.bar()
df.plot.barh(stacked=True, alpha=0.5)
================================================================================
seaborn
import seaborn as sns
================================================================================
sns.barplot(df) # 不知道这个图能代表什么
================================================================================
直方图
df.plot.hist()
密度图
df.plot.density()
--------------------------------------------------------------------------------
comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
sns.distplot(values, bins=100, color='k')
--------------------------------------------------------------------------------
散列图:
sns.regplot('A', 'B', data=df) # A, B 时相关的列,这里就是意思一下,无意义
--------------------------------------------------------------------------------
散布图矩阵
sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})
================================================================================
分面网格(facet grid)和类型数据
--------------------------------------------------------------------------------
ns.factorplot()
--------------------------------------------------------------------------------
分享
收藏
点赞人
举报
文章标签
评论列表