python怎么画出好看的统计图_python数据可视化之如何用matplotlib画出漂亮美观的趋势图...

这几天完成了一个小项目,matplotlib画出的图像总是不理想,很多细节需要调节,譬如横坐标的控制、图例的控制、周边留白的控制还有图片大小尺寸的控制,都需要根据业务需求来调整。

下面我一步步来说明怎么控制画图的参数

1. 最基本的画图

首先先来一个画图的小demo,看看10天的变化趋势图

# coding:utf-8

import matplotlib.pyplot as plt

x = [u'2018-07-01', u'2018-07-02', u'2017-07-03', u'2017-07-04', u'2017-07-05'

, u'2018-07-06', u'2018-07-07', u'2017-07-08', u'2017-07-09', u'2017-07-10']

y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

plt.plot(x, y, label='yy', linewidth=1, color='orange', marker='o', markerfacecolor='red', markersize=1)

plt.show()

结果是这样:

2.画图保存

大多数时候我们需要的不仅仅是把图片画出来,还要保存到本地,这时候需要改一个地方,把上面的代码最后一行换了,用plt.savefig('文件名')替换plt.show()。

# coding:utf-8

import matplotlib.pyplot as plt

x = [u'2018-07-01', u'2018-07-02', u'2017-07-03', u'2017-07-04', u'2017-07-05'

, u'2018-07-06', u'2018-07-07', u'2017-07-08', u'2017-07-09', u'2017-07-10']

y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

# 这里设置线宽、线型、线条颜色、点大小等参数

plt.plot(x, y, label='yy', linewidth=1, color='orange', marker='o', markerfacecolor='red', markersize=1)

plt.savefig('/Users/taorui02/Desktop/pct1.png')

结果是这样

3.去掉图片周边的留白

在使用图片的时候图像周边太多空白会浪费很多空间,这时候只需要在上面代码最后一行代码加一点信息, plt.savefig('/Users/taorui02/Desktop/pct1.png', bbox_inches='tight') 替换 plt.savefig('/Users/taorui02/Desktop/pct1.png') 这里的bbox_inches='tight'就有这个功能。 结果是这样:

4. 加入标题、x轴y轴名称

这里只需要在画图代码前添加三行代码:

# 标题

plt.title("title")

# 横坐标描述

plt.xlabel('date')

# 纵坐标描述

plt.ylabel('num')

5. 图例

在画图后添加一行代码,就能显示图例。

# 设置数字标签

plt.legend(loc='upper left')

loc设置图例的位置,图例信息在执行plot的时候设置的。

6. 画布大小

添加一行代码来设置

# 设置画布大小

plt.figure(figsize=(20, 4))

显示结果:

画了一个比较宽的图,解决了横坐标相互遮挡的问题

7. 给坐标点加标注

加两行代码:

# 每个数据点加标签

for a, b in zip(x, y):

plt.text(a, b, b, ha='center', va='bottom', fontsize=10)

结果:

如果只需要给一个点加标注:

# 只给最后一个点加标签

plt.text(x[-1], y[-1], y[-1], ha='center', va='bottom', fontsize=10)

结果:

8. 横坐标部分显示

这个比较复杂,直接看代码,这里调用了ticker.MaxNLocator(tick_spacing),MaxNLocato方法用来控制横轴显示的最多的标记数,还可以通过其他方法控制,比如间隔数。 这里麻烦的是要画子图才能实现。

# coding:utf-8

import matplotlib.pyplot as plt

import matplotlib.ticker as ticker

x = ['2018-07-01', '2018-07-02', '2017-07-03', '2017-07-04', '2017-07-05'

, '2018-07-06', '2018-07-07', '2017-07-08', '2017-07-09', '2017-07-10']

y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

# 设置画布大小

plt.figure(figsize=(20, 4))

# 标题

plt.title("title")

# 横坐标描述

plt.xlabel('date')

# 纵坐标描述

plt.ylabel('num')

tick_spacing = 3

fig, ax = plt.subplots(1, 1)

ax.xaxis.set_major_locator(ticker.MaxNLocator(tick_spacing))

# 这里设置线宽、线型、线条颜色、点大小等参数

ax.plot(x, y, label='yy', linewidth=1, color='orange', marker='o', markerfacecolor='red', markersize=1)

# 每个数据点加标签

#for a, b in zip(x, y):

# plt.text(a, b, b, ha='center', va='bottom', fontsize=10)

# 只给最后一个点加标签

plt.text(x[-1], y[-1], y[-1], ha='center', va='bottom', fontsize=10)

# 图例显示及位置确定

plt.legend(loc='upper left')

plt.savefig('/Users/taorui02/Desktop/pct1.png', bbox_inches='tight')

结果:

9.横轴坐标标签旋转

添加代码:

# 旋转x轴标签

for label in ax.get_xticklabels():

label.set_rotation(30) # 旋转30度

label.set_horizontalalignment('right') # 向右旋转

结果:

10.画多条线

多线只需要多加一行plot代码

# coding:utf-8

import matplotlib.pyplot as plt

import matplotlib.ticker as ticker

x = ['2018-07-01', '2018-07-02', '2017-07-03', '2017-07-04', '2017-07-05'

, '2018-07-06', '2018-07-07', '2017-07-08', '2017-07-09', '2017-07-10']

y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

z = [1, 2, 3, 4, 7, 1, 2, 3, 4, 10]

# 设置画布大小

plt.figure(figsize=(20, 4))

tick_spacing = 4

fig, ax = plt.subplots(1, 1)

ax.xaxis.set_major_locator(ticker.MaxNLocator(tick_spacing))

# 标题

plt.title("title")

# 横坐标描述

plt.xlabel('date')

# 纵坐标描述

plt.ylabel('num')

# 这里设置线宽、线型、线条颜色、点大小等参数

ax.plot(x, y, label='yy', linewidth=2, color='black', marker='o', markerfacecolor='red', markersize=4)

ax.plot(x, z, label='zz', linewidth=2, color='red', marker='o', markerfacecolor='black', markersize=4)

# 每个数据点加标签

for a, b in zip(x, z):

plt.text(a, b, str(b)+'%', ha='center', va='bottom', fontsize=12)

# 只给最后一个点加标签

plt.text(x[-1], y[-1], y[-1], ha='center', va='bottom', fontsize=15)

# 旋转x轴标签

for label in ax.get_xticklabels():

label.set_rotation(30) # 旋转30度

label.set_horizontalalignment('right') # 向右旋转

# 图例显示及位置确定

plt.legend(loc='upper left')

plt.savefig('/Users/taorui02/Desktop/pct1.png', bbox_inches='tight')

最后结果

11.像素、分辨率设置

按默认值画出的图会有点虚,这时候就需要设置一下像素和分辨率。

plt.rcParams['savefig.dpi'] = 300 #图片像素

plt.rcParams['figure.dpi'] = 600 #分辨率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值