Python作图简介

目录

设置作图方式

如果你使用的IDE是spyder,可以通过如图的位置进行设置,设置完成后重启spyder以使设置生效

image
image

或者你可以通过运行下面的命令进行快速设置

#在console中输出图片
%matplotlib inline 
#在单独窗口中输出图片
%matplotlib qt5 

工具简介

下面我会基于两个工具来介绍python的基本作图。

Matplotlib

Matplotlib 是一个非常强大的 Python 画图工具;

它能帮你画出美丽的:

  • 线图;
  • 散点图;
  • 等高线图;
  • 条形图;
  • 柱状图;
  • 3D 图形,
  • 甚至是图形动画等等.

Seaborn

Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,
在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib能制作具有更多特色的图。
应该把Seaborn视为matplotlib的补充,而不是替代物。

基本用法

import matplotlib.pyplot as plt  # 使用import导入模块matplotlib.pyplot,并简写成plt  
import numpy as np  # 使用import导入模块numpy,并简写成np
x = np.linspace(-1, 1, 50)  # 使用np.linspace定义x:范围是(-1,1);个数是50.   
y = 2*x + 1  # 仿真一维数据组(x ,y)表示曲线1.
plt.figure()  # 使用plt.figure定义一个图像窗口. 
plt.plot(x, y)  # 使用plt.plot画(x ,y)曲线.
plt.title('fig1')  # 设置标题
plt.show()  #  使用plt.show显示图像.
image

设置坐标轴

调整名字和间隔

x = np.linspace(-3, 3, 50)  # 使用np.linspace定义x:范围是(-3,3); 个数是50.   
y1 = 2*x + 1  # 仿真一维数据组(x ,y1)表示曲线1.   
y2 = x**2  # 仿真一维数据组(x ,y2)表示曲线2.
plt.figure()  # 使用plt.figure定义一个图像窗口. 
plt.plot(x, y2)  # 使用plt.plot画(x ,y2)曲线.
# 使用plt.plot画(x ,y1)曲线,曲线的颜色属性(color)为红色;
# 曲线的宽度(linewidth)为1.0;  
# 曲线的类型(linestyle)为虚线.
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')  

plt.xlim((-1, 2))  # 使用plt.xlim设置x坐标轴范围:(-1, 2);
plt.ylim((-2, 3))  # 使用plt.ylim设置y坐标轴范围:(-2, 3); 
plt.xlabel('I am x')  # 使用plt.xlabel设置x坐标轴名称:’I am x’;
plt.ylabel('I am y')  # 使用plt.ylabel设置y坐标轴名称:’I am y’;
plt.show()  # 
image

Legend 图例

添加图例

matplotlib 中的 legend 图例就是为了帮我们展示出每个数据对应的图像名称.
更好的让读者认识到你的数据结构.

首先我们设置两条线的类型等信息(蓝色实线与红色虚线).

# set line syles
l1, = plt.plot(x, y1, label='linear line')
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')

# legend将要显示的信息来自于上面代码中的 label. 所以我们只需要简单写下一下代码, plt 就能自动的为我们添加图例.
plt.legend(loc='upper right')
plt.show()
image

参数 loc='upper right' 表示图例将添加在图中的右上角.

调整位置和名称

如果我们想单独修改之前的 label 信息, 给不同类型的线条设置图例信息.
我们可以在 plt.legend 输入更多参数. 如果以下面这种形式添加 legend,
我们需要确保, 在上面的代码 plt.plot(x, y2, label='linear line')
plt.plot(x, y1, label='square line') 中有用变量 l1 和 l2 分别存储起来.
而且需要注意的是 l1, l2,要以逗号结尾, 因为plt.plot() 返回的是一个列表.

l1, = plt.plot(x, y1, label='linear line')
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')
plt.legend(handles=[l1, l2], labels=['up', 'down'],  loc='best')
plt.show()
image

这样我们就能分别重新设置线条对应的 label 了.

最后我们得到带有图例信息的图片.

其中'loc'参数有多种,'best'表示自动分配最佳位置,其余的如下:

  • 'best' : 0,
  • 'upper right' : 1,
  • 'upper left' : 2,
  • 'lower left' : 3,
  • 'lower right' : 4,
  • 'right' : 5,
  • 'center left' : 6,
  • 'center right' : 7,
  • 'lower center' : 8,
  • 'upper center' : 9,
  • 'center' : 10

使用python作图进行基本的数据探索

from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

我们使用diamonds 数据集进行数据探索

diamonds=pd.read_csv('https://raw.githubusercontent.com/huangchaosp/hc-blog-attachment/master/data/diamonds.csv')    

通过head() 和 shape 查看数据的结构

diamonds.head()
carat cut color clarity depth table price x y z
0 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
1 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
2 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
3 0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63
4 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
diamonds.shape
(53940, 10)

使用sample() 随机抽取样本数据

ds=diamonds.sample(frac=0.1) #随机抽取10%的数据
ds.shape
(5394, 10)

散点图 scatter

plt.scatter(ds.carat,ds.price)
plt.show()
image

根据散点图,我们猜测钻石价格与克拉数是指数型关系
下面我们来验证一下我们的猜测

plt.scatter(np.log(ds.carat),np.log(ds.price)) 
plt.show()
image

取了log之后,发现log(price)与log(carat)是线性关系

分组绘图 FacetGrid

如何在一幅图上体现多个维度:比如通过颜色

g = sns.FacetGrid(ds, hue='color', size=7.5)
g.map(plt.scatter, 'carat', 'price').add_legend()
plt.show()
image

箱线图 boxplot

使用箱线图查看不同色泽的钻石价格的分布情况

sns.boxplot(x="color", y="price", data=ds) 
plt.show()
image

计数条形图 countplot

通过countplot 我可以看出那个色泽的钻石个数最多

sns.countplot(x='color',data=ds)
plt.show()
image

直方图和分布密度图 histogram density

通过distplot 可以看出不同重量的钻石的分布情况

# 直方图
sns.distplot(ds.carat, kde=False)
plt.show()
image
# 密度图
sns.distplot(ds.carat, kde=True)
plt.show()
image
# 分组查看
g=sns.FacetGrid(data=ds,col='color',col_wrap=3)   # 这里相当于groupby
g=g.map(sns.distplot,'carat')
plt.show()
image

饼图

# The slices will be ordered and plotted counter-clockwise.
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' # 定义标签
sizes = [15, 30, 45, 10] # 每一块的比例
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] # 每一块的颜色
explode = (0, 0.1, 0, 0) # 突出显示,这里仅仅突出显示第二块(即 'Hogs' )
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.axis('equal') # 显示为圆(避免比例压缩为椭圆)
plt.show()
image

热力图

flights = sns.load_dataset('flights')
flights.head()
year month passengers
0 1949 January 112
1 1949 February 118
2 1949 March 132
3 1949 April 129
4 1949 May 121
# pivot() 可以将dataframe转换为行列式矩阵 并指定每个元素的存储值
flights = flights.pivot(index='month', columns='year',  values='passengers')
flights.head()
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
month
January 112 115 145 171 196 204 242 284 315 340 360 417
February 118 126 150 180 196 188 233 277 301 318 342 391
March 132 141 178 193 236 235 267 317 356 362 406 419
April 129 135 163 181 235 227 269 313 348 348 396 461
May 121 125 172 183 229 234 270 318 355 363 420 472
plt.figure(figsize=(10,6))
sns.heatmap(flights, fmt='d', linewidths=.5)
# fmt设置字体模式  linewidth设置每个小方格的间距 线宽
plt.show()
image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容