数据可视化能让人们更直观的了解数据所要传递的信息,就像画家可以用绘画来感知世界一样。
本文前两部分就来学习一下如何用python实现这一目的。
你还记得吗?在《如何使用python进行数据分析》一文中,我们的项目遗留了一个小尾巴没有解决。本文最后我们将重新梳理思路并完成该案例的分析,跟紧步伐继续学习吧~
一只小猴:如何使用python进行数据分析?zhuanlan.zhihu.commatplotlib,是matrix+plot+library的缩写,是基于python的非常强大绘图库,提供完全的2D支持和部分3D图像支持。由于它不是python内置库,调用前需手动安装。
(一)导入
调用matplotlib库绘图一般使用pyplot子模块,其集成了绝大部分常用的方法。
import matplotlib.pyplot as plt
%matplotlib inline
%matplotlib inline是一个魔法函数,当输入plt.plot(x,y)后,不必再输入plt.show(),图像将自动显示出来,此语句常在jupyter notebook中使用。
(二)绘图
1. 折线图
# 生成数据
x = [1,3,5,7]
y = [2,4,9,8]
# 新建一个空画布
plt.figure()
# 绘图
plt.plot(x,y)
# 图像显示
plt.show()
在以上操作的基础上设置画布大小、线型、线条颜色及标题。
# 生成数据
x = np.linspace(-10,10,1000)
# 新建画布,并设置尺寸
plt.figure(figsize=(8,5))
# 设置线型、线条颜色
plt.plot(x,np.sin(x), '-.r', label='sin(x)')
plt.plot(x,np.cos(x), 'g', label='cos(x)')
# 显示图例
plt.legend()
# 设置标题
plt.title('I'm Title')
plt.show()
注意:默认是无法显示中文的,如有需要,在绘图代码中加上下方代码即可。
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号乱码
plt.rcParams['axes.unicode_minus'] = False
2. 散点图
# 随机生成0-1范围内的10个点
x = np.random.rand(10)
y = np.random.rand(10)
plt.scatter(x, y)
plt.show()
在以上操作的基础上设置散点颜色、大小、透明度及形状。
n = 20
x = np.random.rand(n)
y = np.random.rand(n)
colors = np.random.rand(n)
size = (15*np.random.rand(n))**2
plt.scatter(x, y, s=size, c=colors, marker='^', alpha=0.4)
plt.show()
3. 条形图
price = [39.5, 39.9, 45.4, 38.9, 33.34]
plt.barh(range(5), price, height=0.5, color='steelblue', alpha=0.5)
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
# 设置横坐标轴名称
plt.xlabel('价格')
# 设置横坐标轴刻度范围
plt.xlim(30,47)
plt.title('不同平台图书价格')
# 设置数据标签位置及大小
for x, y in enumerate(price):
plt.text(y + 0.3, x - 0.1, '%s' % y)
plt.show()
思考一下,如何更改以上代码,将其转位纵向条形图呢?
price = [39.5, 39.9, 45.4, 38.9, 33.34]
plt.bar(range(5), price, width=0.5, color='steelblue', alpha=0.5)
plt.xticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
plt.ylabel('价格')
plt.ylim(30,47)
plt.title('不同平台图书价格')
plt.show()
4. 直方图
data = np.random.randn(10000)
plt.hist(data, bins=40, facecolor='blue', edgecolor='black', alpha=0.7)
# 设置横坐标轴名称
plt.xlabel('区间')
# 设置纵坐标轴名称
plt.ylabel('频数/频率')
# 显设置图标题
plt.title('频数/频率分布直方图')
plt.show()
5. 饼图
name = ['亚马逊', '当当网', '中国图书网', '京东', '天猫']
price = [39.5, 39.9, 45.4, 38.9, 33.34]
plt.figure(figsize=(5,5))
plt.pie(price, labels=name, autopct='%.2f%%')
plt.show()
在以上操作的基础上,显示阴影及突出显示类目。
name = ['亚马逊', '当当网', '中国图书网', '京东', '天猫']
price = [39.5, 39.9, 45.4, 38.9, 33.34]
plt.figure(figsize=(5,5))
plt.pie(price, labels=name, explode=[0,0,0.1,0,0.2], shadow=True, autopct='%.2f%%')
plt.show()
matplotlib虽然提供了大量丰富的可视化绘图接口,但仍存在一定缺点,如绘图步骤繁琐、图不够美观等。因此,在它的基础上封装了更便捷的可视化库,如seaborn、pandas.plot、ggplot。
seaborn是对matplotlib的高级封装,具有更美观的图形样式和颜色配置,并提供了常用的统计图形接口。
使用前同样需要导入,代码格式如下:
import seaborn as sns
这里我们使用的数据是seaborn的默认数据(网盘链接:https://pan.baidu.com/s/19OBxTcSG7YixXkuf2It3eQ 提取码:gnri)。
将数据导入并理解各字段的含义,这对分析问题往往起着事半功倍的效果。
df = pd.read_csv(r'C:UsersAdministratorDesktoptips.csv')
df.head()
1. 散点图
sns.relplot(x='total_bill', y='tip', data=df)
plt.show()
在以上操作的基础上,通过参数hue、style和size实现按另一个变量分组,并设置不同类型的方式和点的大小。
sns.relplot(x='total_bill', y='tip', hue='day', style='time', size='size', data = df)
plt.show()
2. 分布散点图
分布散点图指按照不同类别对样本数据进行图的绘制,一般与箱线图和小提琴图联合使用。
sns.stripplot(x='day', y='total_bill', data=df)
plt.show()
3. 分布密度散点图
分布密度散点图与分布散点图类似,只是对点进行了调整以更好的显示值的分布,因此点不会重叠。
sns.swarmplot(x='day', y='total_bill', data=df)
plt.show()
4. 箱线图
箱线图展示了分位数的位置,它显示了定量数据在一个或多个分类变量的多个层次上的分布,这些分布可以进行比较。
sns.boxplot(x='day', y='total_bill', data=df)
plt.show()
5. 小提琴图
小提琴图以基础分布的核密度估计为特征,通过该图可以知道哪些位置的密度较高,它不像箱线图中所有绘制的组件都对应于实际数据点。
sns.violinplot(x='day', y='total_bill', data=df)
plt.show()
6. 条形图
sns.barplot(x='day', y='total_bill', hue='sex', data=df)
plt.show()
参数estimator用于估计每个分类箱内的统计函数,默认为mean(平均值),numpy的统计函数都可以传入该参数,我们尝试一下设置其为中位数,并更改误差棒的颜色和宽度。
sns.barplot(x='day', y='total_bill', hue='sex', data=df, estimator=np.median, capsize=0.1, errcolor='r')
plt.show()
7. 直方图
data = np.random.randn(10000)
sns.distplot(data, bins=60, hist=True)
plt.show()
以上仅是matplotlib和seaborn一些最基本的内容,实际操作中如果要深入学习可以查看官方文档,里面有很详细的阐述。
matplotlib官方文档:https://matplotlib.org/users/pyplot_tutorial.html
seaborn官方文档:http://seaborn.pydata.org/
这里先放一个最终的结果图。
文末福利放送:数据、全代码及notebook报告的网盘链接,大家按需下载吧~~
链接来啦~
https://pan.baidu.com/s/1CSos-atxC4PSoDxj5ngyPg 提取码:jxec
以上就是全部内容啦,如果你对此项目有更好的分析建议,评论留言告诉我吧。
拜拜~~