利用python进行数据分析之绘图和可视化--小白笔记

%matplotlib notebook 

matplotlib API入门

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd 
data=np.arange(10)
data
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
plt.plot(data)
<IPython.core.display.Javascript object>
[<matplotlib.lines.Line2D at 0x19281145f40>]

Figure和Subplot

matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure:

fig=plt.figure()
<Figure size 640x480 with 0 Axes>
fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)

在这里插入图片描述

如果这时执行一条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就会在最后
一个用过的subplot(如果没有则创建一个)上进行绘制,隐藏创建figure和subplot
的过程。

fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
plt.plot(np.random.randn(50).cumsum(),'k--')
[<matplotlib.lines.Line2D at 0x12955c80160>]

在这里插入图片描述

fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
plt.plot(np.random.randn(50).cumsum(),'k--')
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))

<matplotlib.collections.PathCollection at 0x12957587610>

在这里插入图片描述

参数说明
nrowssubplot的行数
ncolssubplot的列数
sharex所有subplot应该使用相同的X轴刻度
subplot_kw用于创建个subplot的关键字字典
fig_kw创建figure时的其他关键字,如plt.subplots(2,2,figsize=(8,6))

调整subplot周围的间距

默认情况下,matplotlib会在subplot外围留下一定的边距,并在subplot之间留下一
定的间距。间距跟图像的高度和宽度有关,因此,如果你调整了图像大小(不管是
编程还是手工),间距也会自动调整。利用Figure的subplots_adjust方法可以轻而
易举地修改间距,此外,它也是个顶级函数:
subplots_adjust(left=None, bottom=None, right=None, top=None,wspace=None, hspace=None)
wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距

fig, axes = plt.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.subplots_adjust(wspace=0, hspace=0)

在这里插入图片描述

颜色、标记和线型

matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串
缩写。
ax.plot(x,y,‘g–’)ax.plot(x,y,linestyle=‘–’,color=‘g’)
常用的颜色可以使用颜色缩写,你也可以指定颜色码(例如,‘#CECECE’)。你可
以通过查看plot的文档字符串查看所有线型的合集


plt.plot(np.random.randn(30).cumsum(),'ko--')
[<matplotlib.lines.Line2D at 0x12957937e80>]

在这里插入图片描述

plt.plot(np.random.randn(30).cumsum(),color='k',linestyle='--',marker='o')
[<matplotlib.lines.Line2D at 0x12957a86430>]

在这里插入图片描述

data = np.random.randn(30).cumsum()
plt.plot(data, 'k--', label='Default')
plt.plot(data, 'k-', drawstyle='steps-post', label='steps-post')
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x12957d39970>

在这里插入图片描述

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

fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())
[<matplotlib.lines.Line2D at 0x12958f131f0>]

在这里插入图片描述

要改变x轴刻度,最简单的办法是使用set_xticks和set_xticklabels

fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())
ticks=ax.set_xticks([0,250,500,750,1000])
labels=ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')
#rotation选项设定x刻度标签倾斜30度
ax.set_xlabel('Stages')
ax.set_title('My first matplotlib plot')
Text(0.5, 1.0, 'My first matplotlib plot')

在这里插入图片描述

Y轴的修改方式与此类似,只需将上述代码中的x替换为y即可。轴的类有集合方
法,可以批量设定绘图选项。
props={
‘title’:‘My first matplotlib plot’
‘xlabel’:‘Stages’

}
ax.set(**props)

添加图例

图例(legend)是另一种用于标识图表元素的重要工具。添加图例的方式有多种。
最简单的是在添加subplot的时候传入label参数:

fig=plt.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')
<matplotlib.legend.Legend at 0x129579387c0>

在这里插入图片描述

注解以及在Subplot上绘图

除标准的绘图类型,你可能还希望绘制一些子集的注解,可能是文本、箭头或其他
图形等。注解和文字可以通过text、arrow和annotate函数进行添加
ax.text(x, y, ‘Hello world!’,family=‘monospace’, fontsize=10)

from datetime import datetime
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
data = pd.read_csv('F:/项目学习/利用Pyhon进行数据分析(第二版)/利用Pyhon进行数据分析/pydata-book-2nd-edition/examples/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']
spx.plot(ax=ax, style='k-')
crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Stearns Fails'),
    (datetime(2008, 9, 15), 'Lehman Bankruptcy')
]
for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor='black', headwidth=4,
                                width=2,
                                headlength=4),
                horizontalalignment='left', verticalalignment='top')
# Zoom in on 2007-2010
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 1800])
ax.set_title('Important dates in the 2008-2009 financial crisis')
Text(0.5, 1.0, 'Important dates in the 2008-2009 financial crisis')

在这里插入图片描述

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(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
<matplotlib.patches.Polygon at 0x12959cf0610>

在这里插入图片描述

将图表保存到文件

利用plt.savefig可以将当前图表保存到文件。该方法相当于Figure对象的实例方法
savefig。例如,要将图表保存为SVG文件,你只需输入
plt.savefig(‘figpath.svg’)
文件类型是通过文件扩展名推断出来的。因此,如果你使用的是.pdf,就会得到一
个PDF文件。我在发布图片时最常用到两个重要的选项是dpi(控制“每英寸点数”分
辨率)和bbox_inches(可以剪除当前图表周围的空白部分)
plt.savefig(‘figpath.png’, dpi=400, bbox_inches=‘tight’)

savefig并非一定要写入磁盘,也可以写入任何文件型的对象,比如BytesIO:

from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
savefig的其它选项

参数说明
fname含有文件路径的字符串或python的文件型对象
dpi图像分辨率(每英寸点数),默认为100
facecolor、edgecolor图像的背景色,默认为‘w’(白色)
format显式设置文件格式(png、pdf、svg…)
bbox_inches图表需要保存的部分

使用pandas和seaborn绘图

线形图

s=pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()
<Axes: >

在这里插入图片描述

df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
                  columns=['A', 'B', 'C', 'D'],
                  index=np.arange(0, 100, 10))
df
ABCD
0-0.328178-0.9374081.0696640.446050
100.082734-0.519257-0.2875990.759948
20-1.470532-1.130326-1.1284590.276776
30-2.338755-2.276585-0.284231-1.064264
40-2.770433-0.352019-0.990814-1.536565
50-3.4977710.149083-2.079692-0.078499
60-2.2936810.075971-2.276931-0.519354
700.0612880.558535-3.195277-0.183334
801.643792-0.434300-2.232554-0.217443
901.3267861.084292-0.950808-1.909138
df.plot()
<Axes: >

在这里插入图片描述

柱状图

plot.bar()和plot.barh()分别绘制水平和垂直的柱状图。这时,Series和DataFrame的
索引将会被用作X(bar)或Y(barh)刻度

fig, axes = plt.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)
<Axes: >

在这里插入图片描述

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
GenusABCD
one0.4217600.1833220.9387690.358988
two0.2954600.3827620.0210340.178810
three0.0558340.8621290.0799810.832899
four0.9357010.2628380.8184580.628460
five0.0772050.5715420.2211060.805360
six0.6366060.7676450.4850350.865025
df.plot.bar()

<Axes: >

在这里插入图片描述

设置stacked=True即可为DataFrame生成堆积柱状图,这样每行的值就会被堆积在
一起

df.plot.barh(stacked=True,alpha=0.7)
<Axes: >

在这里插入图片描述

笔记:柱状图有一个非常不错的用法:利用value_counts图形化显示Series中
各值的出现频率,比如s.value_counts().plot.bar()。

tips=pd.read_csv('F:/项目学习/利用Pyhon进行数据分析(第二版)/利用Pyhon进行数据分析/pydata-book-2nd-edition/examples/tips.csv')
tips
total_billtipsmokerdaytimesize
016.991.01NoSunDinner2
110.341.66NoSunDinner3
221.013.50NoSunDinner3
323.683.31NoSunDinner2
424.593.61NoSunDinner4
.....................
23929.035.92NoSatDinner3
24027.182.00YesSatDinner2
24122.672.00YesSatDinner2
24217.821.75NoSatDinner2
24318.783.00NoThurDinner2

244 rows × 6 columns

party_counts=pd.crosstab(tips['day'],tips['size'])
party_counts
size123456
day
Fri1161100
Sat253181310
Sun039151831
Thur1484513
party_counts=party_counts.loc[:,2:5]
party_counts
size2345
day
Fri16110
Sat5318131
Sun3915183
Thur48451
#进行规格化,使得各行的和为1,并生成图表
party_pcts=party_counts.div(party_counts.sum(1),axis=0)
party_pcts
size2345
day
Fri0.8888890.0555560.0555560.000000
Sat0.6235290.2117650.1529410.011765
Sun0.5200000.2000000.2400000.040000
Thur0.8275860.0689660.0862070.017241
party_pcts.plot.bar()
<Axes: xlabel='day'>

在这里插入图片描述

import seaborn as sns
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
tips.head()
total_billtipsmokerdaytimesizetip_pct
016.991.01NoSunDinner20.063204
110.341.66NoSunDinner30.191244
221.013.50NoSunDinner30.199886
323.683.31NoSunDinner20.162494
424.593.61NoSunDinner40.172069
sns.barplot(x='tip_pct',y='day',data=tips,orient='h')
<Axes: xlabel='tip_pct', ylabel='day'>

在这里插入图片描述

sns.barplot(x='tip_pct', y='day', hue='time', data=tips, orient='h')
<Axes: xlabel='tip_pct', ylabel='day'>

在这里插入图片描述

直方图和密度图

直方图(histogram)是一种可以对值频率进行离散化显示的柱状图。数据点被拆分
到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量

tips['tip_pct'].plot.hist(bins=50)
<Axes: ylabel='Frequency'>

在这里插入图片描述

tips['tip_pct'].plot.density()
<Axes: ylabel='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')

在这里插入图片描述

散布图或点图

点图或散布图是观察两个一维数据序列之间的关系的有效手段。

macro=pd.read_csv('F:/项目学习/利用Pyhon进行数据分析(第二版)/利用Pyhon进行数据分析/pydata-book-2nd-edition/examples/macrodata.csv')
data=macro[['cpi','m1','tbilrate','unemp']]
trans_data=np.log(data).diff().dropna()
trans_data[-5:]

cpim1tbilrateunemp
198-0.0079040.045361-0.3968810.105361
199-0.0219790.066753-2.2772670.139762
2000.0023400.0102860.6061360.160343
2010.0084190.037461-0.2006710.127339
2020.0088940.012202-0.4054650.042560
sns.regplot(x='m1', y='unemp', data=trans_data)
plt.title('Changes in log m1 versus log unemp')
Text(0.5, 1.0, 'Changes in log m1 versus log unemp')

在这里插入图片描述

在探索式数据分析工作中,同时观察一组变量的散布图是很有意义的,这也被称为
散布图矩阵(scatter plot matrix)。纯手工创建这样的图表很费工夫,所以
seaborn提供了一个便捷的pairplot函数,它支持在对角线上放置每个变量的直方图
或密度估计

sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})
<seaborn.axisgrid.PairGrid at 0x1295f27cfa0>

在这里插入图片描述

分面网格(facet grid)和类型数据

seaborn有一个有用的内置函数catplot,可以简化制作多种分面图

sns.catplot(x='day', y='tip_pct', hue='time', col='smoker',kind='bar', data=tips[tips.tip_pct < 1])

<seaborn.axisgrid.FacetGrid at 0x12953421c70>

在这里插入图片描述

除了在分面中用不同的颜色按时间分组,我们还可以通过给每个时间值添加一行来
扩展分面网格:

sns.catplot(x='day', y='tip_pct', row='time',col='smoker',kind='bar', data=tips[tips.tip_pct < 1])
<seaborn.axisgrid.FacetGrid at 0x129711b4b50>

在这里插入图片描述

sns.catplot(x='tip_pct', y='day', kind='box',data=tips[tips.tip_pct < 0.5])

<seaborn.axisgrid.FacetGrid at 0x129741989d0>

在这里插入图片描述


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python数据分析与可是数据科学领域中常用的工具之一。它提供了丰富的库和方法,用于处理和分析各种类型的数据,并通过图表和可展示数据结果。 在进行数据分析时,Python提供了Pandas和NumPy等强大的库,用于处理和清洗数据。Pandas提供了DataFrame和Series等数据结构,可以方便地操作和查询数据。NumPy提供了各种数学函数和矩阵等工具,可以进行高效的数值计算。 在数据分析的基础上,Python还提供了诸如Matplotlib、Seaborn和Plotly等库,用于数据可。这些库提供了丰富的图表类型,可以用于展示和传达数据的信息。Matplotlib是Python最常用的绘图库之一,提供了各种绘图函数和方法,使用户可以自定义图表的样式和排版。Seaborn是基于Matplotlib的高级绘图库,专注于统计可,提供了丰富的统计图表类型和配色方案。Plotly是一种交互式绘图库,可以生成高质量的图表,并支持与用户的交互。 通过Python数据分析与可,用户可以从数据中提取有价值的信息。比如,可以进行数据聚合和汇总,计算统计指标,发现数据的规律和趋势。同时,数据可也可以帮助用户更直观地理解和解释数据,从而更好地支持决策和沟通。 总之,Python数据分析与可提供了强大的工具和方法,用于对各种类型的数据进行处理、分析和可。它能够帮助用户更深入地理解数据,从中发现价值,并将结果以直观的形式展示出来。无论是在学术研究、商业分析还是日常工作中,Python数据分析与可都是一种有力的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值