matplotlib 数据可视化 - 线性图

线性图、条状图、饼状图

import numpy as np
import matplotlib.pyplot as plt 

线性图

线性图的各个数据点是由一条线来连接的。

如,将函数 y=sin(3*x)/x 展示在图表上。

'''创建x数据'''
x = np.arange(-2*np.pi,2*np.pi,0.01)  # 因为是正弦函数,所以x的值应该是pi的倍数或因数
y = np.sin(3*x)/x
plt.plot(x,y)
plt.show()

对上例进行扩展

显示y=sin(n*x)/x图像

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y)
plt.plot(x,y2)
plt.plot(x,y3)
plt.show()

上例中,我们绘制了三条线,可以看出,matplotlib会自动为不同的线赋予不同的颜色

尝试使用关键字参数color来指定线条的颜色,用linestyle来指定线型

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,'k--',linewidth=3)  # 这是我们之前了解到的
plt.plot(x,y2,'m-.')
plt.plot(x,y3,color='#87a3cc',linestyle='--')
plt.show()

之前,在plot()的第三个参数中,用r可以表示红色,g表示绿色,b表示蓝色,这里列举一些常用的颜色字符代表:

  • b 蓝色
  • g 绿色
  • r 红色
  • c 蓝绿色
  • m 洋红
  • y 黄色
  • k 黑色
  • w 白色

将上图中的x轴变成π的倍数

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,'k--',linewidth=3)
plt.plot(x,y2,'m-.')
plt.plot(x,y3,color='#87a3cc',linestyle='--')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.show()

改变y轴的刻度值

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,'k--',linewidth=3)
plt.plot(x,y2,'m-.')
plt.plot(x,y3,color='#87a3cc',linestyle='--')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])
plt.show()

总结:在设置x/y轴刻度的时候,ticks()中的参数,第一个列表表示刻度范围,第二个参数表示标签,用LeTeX表达式书写

接下来,尝试改变轴的位置

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,color='b')
plt.plot(x,y2,color='r')
plt.plot(x,y3,color='g')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])

'''通过gac区取Axes对象,即获取画轴的对象'''
ax = plt.gca()
print(ax)

plt.show()
AxesSubplot(0.125,0.125;0.775x0.755)
x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,color='b')
plt.plot(x,y2,color='r')
plt.plot(x,y3,color='g')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])

'''通过gac区取Axes对象,即获取画轴的对象'''
ax = plt.gca()
'''spines表示画轴的边对象,这里设置右边和上边轴为无色'''
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
print(ax.spines)

plt.show()
OrderedDict([('left', <matplotlib.spines.Spine object at 0x7f35587482b0>), ('right', <matplotlib.spines.Spine object at 0x7f3558609a90>), ('bottom', <matplotlib.spines.Spine object at 0x7f3558622630>), ('top', <matplotlib.spines.Spine object at 0x7f35585a16a0>)])
x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,color='b')
plt.plot(x,y2,color='r')
plt.plot(x,y3,color='g')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])

'''通过gac区取Axes对象,即获取画轴的对象'''
ax = plt.gca()
'''spines表示画轴的边对象,这里设置右边和上边轴为无色'''
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
'''set_position指定某个轴在哪个位置,这里指定在数据的0,即穿过0'''
ax.spines['bottom'].set_position(('data',0))

plt.show()
x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,color='b')
plt.plot(x,y2,color='r')
plt.plot(x,y3,color='g')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])

'''通过gac区取Axes对象,即获取画轴的对象'''
ax = plt.gca()
'''spines表示画轴的边对象,这里设置右边和上边轴为无色'''
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
'''set_position指定某个轴在哪个位置,这里指定在数据的0,即穿过0'''
ax.spines['bottom'].set_position(('data',0))
'''然后设置y轴的名称,并让它也穿过0'''
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.show()

完整代码:

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,color='b')
plt.plot(x,y2,color='r')
plt.plot(x,y3,color='g')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.show()

用箭头将公式标签指向某一点

使用到的函数是annotate()

x = np.arange(-2*np.pi,2*np.pi,0.01)
y = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.plot(x,y,color='b')
plt.plot(x,y2,color='r')
plt.plot(x,y3,color='g')
plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi],['$-2\pi$','$-\pi$','$0$','$1\pi$','$2\pi$'])
plt.yticks([-1,0,1,2,3],['$-1$','$0$','$1$','$2$','$3$'])

plt.annotate(r'$\lim_{x\to 0}\frac{\sin(x)}{x}=1$',  # 表达式
             xy=[0,1],  # 坐标
             xycoords='data',  
             xytext=[30,30],  # 文本坐标
             fontsize=16,  # 字体大小 
             textcoords='offset points',
             arrowprops=dict(arrowstyle="->",connectionstyle="arc3, rad=.2"))  # 指定箭头

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.show()

为pandas数据结构绘制线性图

import pandas as pd

data = {'one':[1,3,4,5,5],
       'two':[2,4,5,2,7],
       'three':[3,2,4,8,9]}
df = pd.DataFrame(data)
x = np.arange(5)
plt.axis([0,5,0,7])
plt.plot(x,df)
plt.legend(data, loc=2)
plt.show()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 很久以前看到一句话,说我们的人生就像坐公交车,生命中来来往往很多人,但是一站有一站要下的人,一战也有一站要上的人;...
    清茶咖啡阅读 216评论 0 1
  • (转)https://segmentfault.com/a/1190000000733959 什么是模块化开发,为...
    胡儒清阅读 268评论 0 0