查看原文
其他

数据可视化利器——Matplotlib

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈   鼎,中南财经政法大学统计与数学学院

本文编辑:杨婉清

技术总编:陈   鼎

Stata&Python云端课程来啦!

好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

matplotlib库是一个风格类似于matlab的图表绘制系统,是Python中最著名的绘图库。它能让使用者轻松地将数据可视化,并且提供多样化的输出格式。今天就由笔者分享几种酷炫的图表,展示一下matplotlib库的强大。

01准备工作

首先,导入所需的库:

import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltimport seaborn as snsimport warnings; warnings.filterwarnings(action='once')from matplotlib.axes._axes import _log as matplotlib_axes_logger

如果没有安装过matplotlib库,可以在命令提示行中输入以下代码进行安装:

pip install matplotlib

在绘制图形前,先设置一下图表样式:

matplotlib_axes_logger.setLevel('ERROR')large = 22; med = 16; small = 12params = {'axes.titlesize': large, 'legend.fontsize': med, 'figure.figsize': (16, 10), 'axes.labelsize': med, 'axes.titlesize': med, 'xtick.labelsize': med, 'ytick.labelsize': med, 'figure.titlesize': large}plt.rcParams.update(params)plt.style.use('seaborn-whitegrid')sns.set_style("white")
# Versionprint(mpl.__version__) #> 3.3.1print(sns.__version__) #> 0.11.002绘图1散点图

散点图是指在统计分析中,数据点在直角坐标系平面上的分布图。散点图可以展示数据的分布和聚合情况,如果数据有多个组,则需要用颜色加以区分。下面的例子直观地展示了不同地区的人口与面积的关系:

# 导入数据集midwest = pd.read_csv("C:/Users/chending/Desktop/midwest_filter.csv")
# 准备数据categories = np.unique(midwest['category'])colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]
# 对每个列进行散点图绘制plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')
for i, category in enumerate(categories): plt.scatter('area', 'poptotal', data=midwest.loc[midwest.category==category, :], s=20, c=colors[i], label=str(category))
# 美化图表plt.gca().set(xlim=(0.0, 0.1), ylim=(0, 90000), xlabel='Area', ylabel='Population')
plt.xticks(fontsize=12); plt.yticks(fontsize=12)plt.title("Scatterplot of Midwest Area vs Population", fontsize=22)plt.legend(fontsize=12)
plt.show()

2边缘直方图

 边缘直方图可以展示变量在X轴与Y轴上的分布情况。这有利于观测数据集基于单变量的分布特征。

# 导入数据集df = pd.read_csv("C:/Users/chending/Desktop/mpg_ggplot2.csv")
# 创建图与网格fig = plt.figure(figsize=(16, 10), dpi= 80)grid = plt.GridSpec(4, 4, hspace=0.5, wspace=0.2)
# 定义轴ax_main = fig.add_subplot(grid[:-1, :-1])ax_right = fig.add_subplot(grid[:-1, -1], xticklabels=[], yticklabels=[])ax_bottom = fig.add_subplot(grid[-1, 0:-1], xticklabels=[], yticklabels=[])
# 主轴散点图绘制ax_main.scatter('displ', 'hwy', s=df.cty*4, c=df.manufacturer.astype('category').cat.codes, alpha=.9, data=df, cmap="tab10", edgecolors='gray', linewidths=.5)
# 右侧直方图ax_bottom.hist(df.displ, 40, histtype='stepfilled', orientation='vertical', color='blue')ax_bottom.invert_yaxis()
# 底部直方图ax_right.hist(df.hwy, 40, histtype='stepfilled', orientation='horizontal', color='blue')
# 美化图表ax_main.set(title='Scatterplot with Histograms displ vs hwy', xlabel='displ', ylabel='hwy')ax_main.title.set_fontsize(20)for item in ([ax_main.xaxis.label, ax_main.yaxis.label] + ax_main.get_xticklabels() + ax_main.get_yticklabels()): item.set_fontsize(14)
xlabels = ax_main.get_xticks().tolist()ax_main.set_xticklabels(xlabels)plt.show()

3相关图

相关图可以直观地观测出给定数据所有变量之间的相关关系。利用相关图可以美观地比较出变量之间的相关程度大小,并输出相关系数矩阵:

# Import Datasetdf = pd.read_csv("C:/Users/chending/Desktop/mtcars.csv")
# Plotplt.figure(figsize=(12,10), dpi= 80)sns.heatmap(df.corr(), xticklabels=df.corr().columns, yticklabels=df.corr().columns, cmap='RdYlGn', center=0, annot=True)
# Decorationsplt.title('Correlogram of mtcars', fontsize=22)plt.xticks(fontsize=12)plt.yticks(fontsize=12)plt.show()

4矩阵图

矩阵图常用于探索性数据分析中,它能尽可能地挖掘出所有的数字变量之间的相关关系。采用经典的鸢尾花数据集,绘制矩阵图,来看看变量之间的相关关系:

# Load Datasetdf = sns.load_dataset('iris')
# Plotplt.figure(figsize=(10,8), dpi= 80)sns.pairplot(df, kind="reg", hue="species")plt.show()

5坡度图

坡度图可以观察不同时期的主体的变化情况,常用于政策评估,例如用于双重差分法的统计分析中。下面这个例子展示了1952年与1957年各个洲的的GDP变化情况:

import matplotlib.lines as mlines# Import Datadf = pd.read_csv("C:/Users/chending/Desktop/gdppercap.csv")
left_label = [str(c) + ', '+ str(round(y)) for c, y in zip(df.continent, df['1952'])]right_label = [str(c) + ', '+ str(round(y)) for c, y in zip(df.continent, df['1957'])]klass = ['red' if (y1-y2) < 0 else 'green' for y1, y2 in zip(df['1952'], df['1957'])]
# draw linedef newline(p1, p2, color='black'): ax = plt.gca() l = mlines.Line2D([p1[0],p2[0]], [p1[1],p2[1]], color='red' if p1[1]-p2[1] > 0 else 'green', marker='o', markersize=6) ax.add_line(l) return l
fig, ax = plt.subplots(1,1,figsize=(14,14), dpi= 80)
# Vertical Linesax.vlines(x=1, ymin=500, ymax=13000, color='black', alpha=0.7, linewidth=1, linestyles='dotted')ax.vlines(x=3, ymin=500, ymax=13000, color='black', alpha=0.7, linewidth=1, linestyles='dotted')
# Pointsax.scatter(y=df['1952'], x=np.repeat(1, df.shape[0]), s=10, color='black', alpha=0.7)ax.scatter(y=df['1957'], x=np.repeat(3, df.shape[0]), s=10, color='black', alpha=0.7)
# Line Segmentsand Annotationfor p1, p2, c in zip(df['1952'], df['1957'], df['continent']): newline([1,p1], [3,p2]) ax.text(1-0.05, p1, c + ', ' + str(round(p1)), horizontalalignment='right', verticalalignment='center', fontdict={'size':14}) ax.text(3+0.05, p2, c + ', ' + str(round(p2)), horizontalalignment='left', verticalalignment='center', fontdict={'size':14})
# 'Before' and 'After' Annotationsax.text(1-0.05, 13000, 'BEFORE', horizontalalignment='right', verticalalignment='center', fontdict={'size':18, 'weight':700})ax.text(3+0.05, 13000, 'AFTER', horizontalalignment='left', verticalalignment='center', fontdict={'size':18, 'weight':700})
# Decorationax.set_title("Slopechart: Comparing GDP Per Capita between 1952 vs 1957", fontdict={'size':22})ax.set(xlim=(0,4), ylim=(0,14000), ylabel='Mean GDP Per Capita')ax.set_xticks([1,3])ax.set_xticklabels(["1952", "1957"])plt.yticks(np.arange(500, 13000, 2000), fontsize=12)
# Lighten bordersplt.gca().spines["top"].set_alpha(.0)plt.gca().spines["bottom"].set_alpha(.0)plt.gca().spines["right"].set_alpha(.0)plt.gca().spines["left"].set_alpha(.0)plt.show()

6密度图&直方图

该图形可以展示出不同组的数据分布。将密度图与直方图叠加,可以更清晰地比较出不同总体的分布差异情况。例如按照不同汽车的类型,查看汽车在城市中行驶的里程分布:

# Import Datadf = pd.read_csv("C:/Users/chending/Desktop/mpg_ggplot2.csv")
# Draw Plotplt.figure(figsize=(13,10), dpi= 80)sns.distplot(df.loc[df['class'] == 'compact', "cty"], color="dodgerblue", label="Compact", hist_kws={'alpha':.7}, kde_kws={'linewidth':3})sns.distplot(df.loc[df['class'] == 'suv', "cty"], color="orange", label="SUV", hist_kws={'alpha':.7}, kde_kws={'linewidth':3})sns.distplot(df.loc[df['class'] == 'minivan', "cty"], color="g", label="minivan", hist_kws={'alpha':.7}, kde_kws={'linewidth':3})plt.ylim(0, 0.35)
# Decorationplt.title('Density Plot of City Mileage by Vehicle Type', fontsize=22)plt.legend()plt.show()

7分类变量的叠加直方图

直方图可以清晰地观测出变量的分布特征。若要进一步区分不同的类别,则需要在直方图的基础上用不同颜色加以区分。例如观察不同汽车厂商在不同汽车类型上的制造分布情况:

# Import Datadf = pd.read_csv("C:/Users/chending/Desktop/mpg_ggplot2.csv")
# Prepare datax_var = 'manufacturer'groupby_var = 'class'df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)vals = [df[x_var].values.tolist() for i, df in df_agg]
# Drawplt.figure(figsize=(16,9), dpi= 80)colors = [plt.cm.Spectral(i/float(len(vals)-1)) for i in range(len(vals))]n, bins, patches = plt.hist(vals, df[x_var].unique().__len__(), stacked=True, density=False, color=colors[:len(vals)])
# Decorationplt.legend({group:col for group, col in zip(np.unique(df[groupby_var]).tolist(), colors[:len(vals)])})plt.title(f"Stacked Histogram of ${x_var}$ colored by ${groupby_var}$", fontsize=22)plt.xlabel(x_var)plt.ylabel("Frequency")plt.ylim(0, 40)plt.show()

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。

欢迎大家在下方留言点赞评论呦~ 

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐          从第七次人口普查看中国人口变化|Stata与Python交互绘图

 200万投资者关注!!哪家公司这么牛?

 
带你领略一天天气之变化

 利用pyecharts看微博粉丝地区分布

 零值太多怎么办?解锁Stata17新命令ziologit

  Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 
速度大比拼之Stata17有多快?

初识PyStata

辞旧迎新——Stata17之Do-file编辑器优化

Stata17新亮点——解放表格输出生产力

【爬虫+可视化】链家网北京租房信息

 手把手教你如何获取股票数据和可视化

  Countvalues——数数的超级小帮手

         frame框架进阶篇

 下拉选择框如何变成“小猫咪” | selenium小技巧

  Python中的运算符知多少?

  快来get缺失值的正确打开方式

  frame框架——我到底在哪个“房间”

如何使用Pandas读取txt文件?

基于MySQL数据库实现增量式爬取

寻找春日气息|本月最受欢迎的景点都在这里!

问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!

Python与数据库交互—浅述pymysql

偷懒小妙招|selenium之玩转鼠标键盘操作--鼠标篇

大家用Stata来“找茬”

“粉墨登场”——多期双重差分法(DID)的Stata操作

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存