python如何绘制线状图_Python数据可视化实例之绘制图表

Python数据可视化实例之绘制图表

原创 虫虫安全 2018-09-05 17:41:57

得利于语言的简单明了、丰富的数据结构、丰富的类和模块,Python如今成了数据科学中的香饽饽,成了matlab、R语言之外又一强大的数据分析工具。抛开其他方面的、今天虫虫带大家一起来探索Python在数据可视化方面的应用。我们以最基本的几种图标为实例来介绍Python matplotlib的强大的作图能力。

1.折线图

在绘制折线图时,如果你的数据很小,图表的线条有点折,当你数据集比较大时候,比如超过100个点,则会呈现相对平滑的曲线。

在这里,我们使用三个plt.plot绘制了,不同斜率(1,2和3)的三条线。

import numpy as np

import matplotlib.pyplot as plt

cc= np.linspace(0,2,100)

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.plot(cc,cc,label='linear')

plt.plot(cc,cc**2,label='两倍')

plt.plot(cc,cc**3,label='三倍')

plt.xlabel('x label')

plt.ylabel('y label')

plt.title("折线图")

plt.legend()

plt.show()

cc = np.linspace(0,2,100)

plt.plot(cc,cc,label ='linear')

plt.plot(cc,cc ** 2,label ='quadratic')

plt.plot(cc,cc ** 3,label ='cubic')

plt.xlabel('x label')

plt.ylabel('y label')

结果显示,如下:

u=4230585677,1700836128&fm=173&app=25&f=JPEG?w=571&h=449&s=0CAA7432190B644F58C959CA0000C0B1

注意为了显示中文,我们plt.rcParams属性设置了中文字体,不然不能正确显示中文title的。

2.散点图

散点图和折线图的原理差不多;如果使用直线连接散点图中的点,得到的就是折线图。所以你只需要设置线型来绘制散点图。

注意:次例中我们也画了三行。不同的地方时,只使用了一个plt.plot。

import numpy as np

import matplotlib.pyplot as plt

x = np.arange(0., 5., 0.2)

plt.plot(x, x, 'r--', x, x**2, 'bs', x, x**3, 'g^')

plt.show()

图表显示结果为:

u=1028373370,3091541836&fm=173&app=25&f=JPEG?w=489&h=355&s=D8A03C72334F614958F9D8CA0000A0B3

3.直方图

直方图也是一种常用的简单图表,本例中我们在同一张图片中绘制两个概率直方图。

import numpy as np

import matplotlib.pyplot as plt

np.random.seed(19680801)

mu1, sigma1 = 100, 15

mu2, sigma2 = 80, 15

x1 = mu1 + sigma1 * np.random.randn(10000)

x2 = mu2 + sigma2 * np.random.randn(10000)

n1, bins1, patches1 = plt.hist(x1, 50, density=True, facecolor='g', alpha=1)

n2, bins2, patches2 = plt.hist(x2, 50, density=True, facecolor='r', alpha=0.2)

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.xlabel('智商')

plt.ylabel('置信度')

plt.title('IQ直方图')

plt.text(110, .025, r'$mu=100, sigma=15$')

plt.text(50, .025, r'$mu=80, sigma=15$')

# 设置坐标范围

plt.axis([40, 160, 0, 0.03])

plt.grid(True)

plt.show()

显示效果为:

u=2958576781,23161871&fm=173&app=25&f=JPEG?w=607&h=452&s=59A43D7328F1D38C67D19E4502006065

4.条形图

我们要介绍的第四种,图表类型是条形图,我们这儿引入稍微比较复杂的条形图。

4.1平行条形图

此例中,我们引入三组(a,b,c)5个随机数(0~1),并用条形图打印出来,做比较

import numpy as np

import matplotlib.pyplot as plt

size = 5

a = np.random.random(size)

b = np.random.random(size)

c = np.random.random(size)

x = np.arange(size)

total_width, n = 0.8, 3

width = total_width / n

# redraw the coordinates of x

x = x - (total_width - width) / 2

# here is the offset

plt.bar(x, a, width=width, label='a')

plt.bar(x + width, b, width=width, label='b')

plt.bar(x + 2 * width, c, width=width, label='c')

plt.legend()

plt.show()

显示效果为:

u=2588161592,4232156896&fm=173&app=25&f=JPEG?w=573&h=429&s=29EECC12C607CB1B435DFF6202007074

4.2堆积条形图

数据同上,不过条形plot的时候,用的相互的值大小差异(水平方向),而不是条柱平行对比。

import numpy as np

import matplotlib.pyplot as plt

size = 5

a = np.random.random(size)

b = np.random.random(size)

c = np.random.random(size)

x = np.arange(size)

plt.bar(x, a, width=0.5, label='a',fc='r')

plt.bar(x, b, bottom=a, width=0.5, label='b', fc='g')

plt.bar(x, c, bottom=a+b, width=0.5, label='c', fc='b')

plt.ylim(0, 2.5)

plt.legend()

plt.grid(True)

plt.show()

显示效果为:

u=911545861,1441157742&fm=173&app=25&f=JPEG?w=559&h=427&s=597FA952D697DB9A1A415DD20200F0B2

5.饼图

饼图是对比数量比例的最佳显示方式。

5.1一般饼图

ABCD四个数据,我们以饼图方式显示器大小对比。

import matplotlib.pyplot as plt

labels = 'A', 'B', 'C', 'D'

sizes = [15, 30, 45, 10]

explode = (0, 0.1, 0, 0)

plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',

shadow=True, startangle=90)

plt.axis('equal')

plt.show()

显示效果为:

u=3412301584,3626373016&fm=173&app=25&f=JPEG?w=451&h=379&s=21B7CF32021777C4DA1D9B2D0300B065

5.2嵌套饼图

import numpy as np

import matplotlib.pyplot as plt

size = 0.3

vals = np.array([[60., 32.], [37., 40.], [29., 10.]])

cmap = plt.get_cmap("tab20c")

outer_colors = cmap(np.arange(3)*4)

inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))

print(vals.sum(axis=1))

# [92. 77. 39.]

plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,

wedgeprops=dict(width=size, edgecolor='w'))

print(vals.flatten())

# [60. 32. 37. 40. 29. 10.]

plt.pie(vals.flatten(), radius=1-size, colors=inner_colors,

wedgeprops=dict(width=size, edgecolor='w'))

# equal makes it a perfect circle

plt.axis('equal')

plt.show()

显示效果为:

u=2898013909,3789421752&fm=173&app=25&f=JPEG?w=400&h=342&s=3EE3D816433245865354B959030060E1

5.3极轴饼图

极轴饼图是一种非常酷的图表,让我们看他的源码:

import numpy as np

import matplotlib.pyplot as plt

np.random.seed(19680801)

N = 10

theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)

radii = 10 * np.random.rand(N)

width = np.pi / 4 * np.random.rand(N)

ax = plt.subplot(111, projection='polar')

bars = ax.bar(theta, radii, width=width, bottom=0.0)

for r, bar in zip(radii, bars):

bar.set_facecolor(plt.cm.viridis(r / 10.))

bar.set_alpha(0.5)

plt.show()

显示效果为:

u=614561438,2747731496&fm=173&app=25&f=JPEG?w=479&h=435&s=8CA47C321152F3CC4459904E0300E0F3

6.3D图表

3D图表也是能我们展示出超想象力的视觉效果的图表。

6.1三维散点图

首先来看看三维的散点图,源码:

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

data = np.random.randint(0, 255, size=[40, 40, 40])

x, y, z = data[0], data[1], data[2]

ax = plt.subplot(111, projection='3d')

ax.scatter(x[:10], y[:10], z[:10], c='y')

ax.scatter(x[10:20], y[10:20], z[10:20], c='r')

ax.scatter(x[30:40], y[30:40], z[30:40], c='g')

ax.set_zlabel('Z')

ax.set_ylabel('Y')

ax.set_xlabel('X')

plt.show()

显示效果为:

u=1363133368,994832273&fm=173&app=25&f=JPEG?w=485&h=389&s=65C6FC1243A0EAEE55D8807E03004063

6.2 3D平面图

我们要用到mpl_toolkits.mplot3d这个3D模块包,安装这个包后,绘制一个超酷的3D图只需两行代码:

from matplotlib import pyplot as plt

import numpy as np

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()

ax = Axes3D(fig)

X = np.arange(-4, 4, 0.25)

Y = np.arange(-4, 4, 0.25)

X, Y = np.meshgrid(X, Y)

R = np.sqrt(X**2 + Y**2)

Z = np.sin(R)

显示效果为:

u=1878878567,1780603216&fm=173&app=25&f=JPEG?w=493&h=309&s=34185832137C6786047839570300E0A0

怎么样,效果很酷把,好今天虫虫就给大家介绍到这里,如果你有任何问题,或者需要本文提到的源码包,请关注虫虫,给虫虫留言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值