python可视化-seaborn/matplotlib

写完利用python代替EXCEL常用操作那篇文章后,一直想写一篇python作图的文章,之所以迟迟没有完成,一来是因为作图细节太多,不好总结,二来自己最初学习python的主要目的是做爬虫和文本处理,即使需要做图,也是用Python把数据处理好然后喂给EXCEL或者Tableau(老是觉得python做的图很丑),后来开始做机器学习的项目发现研究过程中还是用python作图效率更高些
作图方面细节非常多,不可能一次写完,正好最近在读《精益创业》,对书里介绍的MVP法则(最小可行产品),所以决定先写一个能看的版本,然后持续更新吧。。。
注:本文每个图都会用seaborn和matplotlib分别实现,seaborn用于快速出图,matplotlib可以设置更多参数实现个性化绘图(matplotlib设置确实很麻烦,还不如直接用Tableau实现,哈哈。。。)
一、准备工作
1、环境搭建
正式工作开始前,需要安装matplotlib,seaborn,pandas和wordcloud(词云)包,Anaconda已经集成了matplotlib,seaborn和pandas包,但是wordcloud包仍然需要自己下载安装,安装教程请参考
python安装第三方包

2、下载数据集
本文数据集下载地址
链接:https://pan.baidu.com/s/1804beamaiEKdT_WciSQqqg
密码:qnqx
本例数据集是拉钩网数据分析岗位明细数据,共有11个特征,分别为:薪酬下限、薪酬上限、工作地点、经验要求、学历要求、工作时间、公司、所处行业、公司融资情况、投资机构、岗位要求等

二、开始作图
1、导入相关包,导入数据

import matplotlib
import numpy as np
import pandas as pd
import seaborn as sns
import re
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
from wordcloud import WordCloud
df = pd.read_excel('la_gou.xlsx')
df_clean= df.drop(['Index', 'home_page', 'address', 'url', 'date_time'],axis=1)
df_clean = df_clean.drop_duplicates(['company', 'title', 'description'])
df_clean = df_clean.reset_index(drop=True)

2、散点图
稍后补

3、频数图
1)数据预处理

city_series = df_clean['city'].value_counts()
y_cor = list(city_series.values) #统计值
x_cor = list(np.arange(len(y_cor))) 

2)频数图_seaborn

f, ax = plt.subplots(figsize=(18, 10)) #设定图片大小
sns.barplot(y=city_series.values, x=city_series.index,orient='v', alpha=0.8, color='red')
for x,y in zip(x_cor,y_cor):         #显示上方文字
    plt.text(x, y+1, '%s' % y, ha='center', va= 'bottom',fontsize=14)
plt.title('各城市职位数量', size = 18)
plt.show()
频数图_seaborn.png

3)频数图_matplotlib

city_series.plot(kind='bar', figsize=(18,10), fontsize=15, rot=40)
for x,y in zip(x_cor,y_cor):
    plt.text(x, y+1, '%s' % y, ha='center', va= 'bottom',fontsize=14)
plt.title('各城市职位数量', size = 18)
plt.show()
频数图_matplotlib.png

4.1 频数图_重新排序
1)数据预处理

experience_series=df_city['experience_new'].value_counts()
experience_series=experience_series.reindex(['1年以下','1-3年','3-5年','5-10年','不限'])

2)频数图_重新排序_seaborn

sns.barplot(y=experience_series.values, x=experience_series.index,orient='v', 
            alpha=0.8, palette="Set1")
plt.ylabel(u'频数', size=15)
plt.show()
频数图_重新排序_seaborn.png

3)频数图_重新排序_matplotlib

experience_series.plot(kind='bar',figsize=(8,5), fontsize=15, rot=0)
plt.grid(color='#95a5a6', linewidth=1,axis='y',alpha=0.2)
plt.xticks(range(5), experience_series.index, size=15)
plt.ylabel('频数', size=15)
plt.show()
频数图_重新排序_matplotlib.png

4.2、频数图_多变量
1)数据预处理

df_city=df_clean[df_clean['city'].isin(['北京','上海','深圳','广州','杭州'])]
df_city['fuzhu'] = 1
#替换前对中文数据去空格
df_city['experience_new'] = df_city['experience'].map(lambda s: s.strip())
df_city = df_city.replace({'experience_new':'应届毕业生'},'1年以下')
df_city = df_city.replace({'experience_new':'10年以上'},'5-10年')
df_xin = df_city.loc[:,['city', 'experience','fuzhu']]#选择多列
df_xin1 = df_city.loc[:,['city', 'experience']]#选择多列

2)频数图_多变量_seaborn

sns.countplot(x="city",hue="experience",data=df_xin1)
plt.legend(loc=0,ncol=3)#loc:0为最优,1右上角,2 左上角  ncol为标签有几列
plt.ylabel('频数', size=15)
plt.show()
频数_多变量_seaborn.png

2)频数图_多变量_matplotlib

df_group = df_city.groupby(['city', 'experience_new'])#聚合
df_grouped = df_group['fuzhu'].agg('sum')
df_grouped.unstack().plot(kind='bar')#stacked=True 为堆积图
plt.legend(loc=0,ncol=3)#loc:0为最优,1右上角,2 左上角  ncol为标签有几列
plt.ylabel('频数', size=15)
plt.show()
频数_多变量_matplotlib.png

4、直方图
1)直方图_seaborn

sns.distplot(df_clean['salary_median'], color='red',kde=False) #kde=True 显示概率密度图
plt.xlabel('薪资(千/月)', size=15)
plt.ylabel('频数', size=15)
plt.title('薪资分布', size=18)
plt.show()
直方图_seaborn.png

2)直方图_matplotlib

df_clean['salary_median'].hist(figsize=(10,6), bins=30, edgecolor='k', grid=False)
plt.xlabel('薪资(千/月)', size=15)
plt.ylabel('频数', size=15)
plt.title('薪资分布', size=18)
plt.xticks(range(0,90,5), size=15) #横坐标范围(0-90,刻度值为5)
plt.yticks(size=15)
plt.grid(axis='y', alpha=0.2) #显示网格
plt.show()
直方图_matplotlib.png

6、折线图
稍后补

7、箱图
1)数据预处理

salary_groupby_city = df_clean.groupby('city')['salary_median']
large_city = city_series[0:6].index
df_city_large = df_clean.loc[df_clean['city'].isin(large_city)]
salary_of_city = []
for city in large_city:          #得到各城市对应的薪水的数组
    salary_value = salary_groupby_city.get_group(city).values
    salary_of_city.append(salary_value)

2)箱图_seaborn

plt.style.use('seaborn-darkgrid')
matplotlib.rcParams['font.sans-serif'] = ['SimHei']# 对于有些seaborn的style,必须同时运行此命令,否则还是不显示中文
sns.boxplot(x = df_city_large['city'],y = df_city_large['salary_median'],palette="Set3")
plt.title('互联网热点城市薪资分布', size=18)
plt.show()
箱图_seaborn.png

3)箱图_matplotlib

plt.style.use('seaborn-darkgrid')
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
# 对于有些seaborn的style,必须同时运行此命令,否则还是不显示中文
plt.figure(figsize=(10,5))
plt.boxplot(salary_of_city, boxprops = {'color':'blue'},
           flierprops = {'markerfacecolor':'red','color':'black','markersize':4})
plt.title('互联网热点城市薪资分布', size=18)
plt.ylabel('薪资(千/月)',size=15)
plt.xticks(np.arange(6)+1,large_city, size=15) #横坐标刻度值设置
plt.yticks(size=15)
plt.grid(color='#95a5a6', linewidth=1,axis='x',alpha=0.2)
plt.show()
箱图_matplotlib.png

6、核密度估计图
稍后补

7、词云

def get_skill(text):
    skill_list = re.findall('([a-zA-Z][0-9a-zA-Z]+|C\#|\.Net|R\d?|A\/B|算法)', text)
    for skill in skill_list:
        if skill.upper() == 'EXCEL' or skill.upper() == 'PPT':
            skill_list[skill_list.index(skill)] = 'office'
    return ','.join(skill_list).upper()
df_clean['skill'] = df_clean['description'].apply(get_skill)
print(df_clean['skill'][:10])
 #生成技能字典
import nltk
skill_list = []
#df_clean表skill列每一行数据插入skill_list列表中
for i in df_clean.index:
    if len(df_clean.loc[i, 'skill']) > 0:
        skill_list.extend(df_clean.loc[i, 'skill'].split(','))

skill_freq = dict(nltk.FreqDist(skill_list))
print(skill_freq)

# 删除主要的提取错误的键值
del skill_freq['AND']
del skill_freq['TO']
del skill_freq['IN']
del skill_freq['DATA']
del skill_freq['THE']
del skill_freq['OF']
del skill_freq['KPI']
del skill_freq['APP']
del skill_freq['WITH']
del skill_freq['SERVER']
print(skill_freq)
wc = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(skill_freq)
plt.figure(figsize=(8,4))
plt.imshow(wc)
plt.axis('off')
plt.show()
词云.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容