Python-matplotlib绘图

一、前言

Matplotlib 是一个 Python的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。

二、安装

用pip命令安装第三方库
pip install matplotlib

三、小试牛刀(直线图、折线图)

先绘制个简单的图形,先导入pyplot模块,然后定义点的坐标,再调用plot方法连线绘图,然后设置图形的属性,最后保存和展示图形。
PS:savefig()方法必须放在show()方法前。

from matplotlib import pyplot as plt  # 导入pyplot模块

# 定义点的坐标,即x、y坐标
x = range(10)
y1 = [i * 2 for i in x]
y2 = [i * 3 for i in x]
# 调用plot方法连线绘图
plt.plot(x, y1, linewidth=1, color="orange", marker="o", label="hhhhhhhh")
plt.plot(x, y2, ":ro", label="ssssss")
plt.xlabel("angle")  # 设置x轴名称
plt.ylabel("sine")  # 设置y轴名称
# 设置横纵坐标
plt.xticks([0, 2, 4, 6, 8, 10, 12])
plt.yticks([0, 5, 10, 15, 20, 25])
plt.title('sine wave')  # 设置标题
plt.grid()  # 设置网格模式
plt.legend(["xxxxx", "yyyyyy"], loc="upper left")  # 设置线条标识
# 设置每个点上的数值
for i in range(10):
    plt.text(x[i], y2[i], y2[i], fontsize=12, color="black", style="italic", weight="light", verticalalignment='center',
             horizontalalignment='right', rotation=0)
plt.savefig('demo.jpg')  # 保存图形,此方法必须放在show()前面,否则保存的是一个空白图
# 使用show展示图形
plt.show()

结果:

常用方法介绍

  • plt.plot(x, y, "格式控制字符串", 关键字=参数)

    • x、y分别是横纵坐标。
    • 格式控制字符串最多可以包括三部分, "线型","颜色", "点型",。入参顺序:线型-》颜色-》点型
      线型:linestyle=['-','--','-.',':']
      颜色:color=['b','g','r','c','m','y','k','w']
      点型:marker=['.',',','o','v','^','<','>','1','2','3','4','s','p','*','h','H','+','x','D','d','|','_','.',',']
    • 关键字参数,例如线条标识label
      plot()设置的属性会被legend()的覆盖,legend()优先级更高
  • plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , **kwargs)

    • x,y表示标签添加的位置,默认是根据坐标轴的数据来度量的,是绝对值,也就是说图中点所在位置的对
      应的值。
    • s表示标签的符号,字符串格式。
    • fontsize顾名思义就是你加标签字体大小了,取整数。
    • verticalalignment表示垂直对齐方式 ,可选 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等。
    • horizontalalignment表示水平对齐方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等。
    • rotation表示标签的旋转角度,以逆时针计算,取整。
    • 后面还有 family 用来设置字体,style 设置字体的风格,weight 字体的粗细, bbox 给字体添加框,如
      bbox=dict(facecolor=‘red’, alpha=0.5) 等,各种风格,应有尽有,总有一款适合你。
  • pyplot.legend(handles,labels,loc) 参考传送门
    handles需要传入你所画线条的实例对象,即调用plt.plot()返回的对象。
    labels是图例的名称(能够覆盖在plt.plot( )中label参数值)。
    loc代表了图例在整个坐标轴平面中的位置(一般选取'best'这个参数值)。supported values are 'best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'

    # 用法一,直接在legend()定义label
    line1, = plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-')
    line2, = plt.plot(n, m2, 'b')
    plt.legend(handles=[line1, line2], labels=['girl购物欲望','boy购物欲望'], loc='best')
    plt.legend(labels=['girl购物欲望','boy购物欲望'], loc='best')  # 这样写也OK,默认一一对应
    # 用法二
    plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-', label='女生购物欲望')  # 给plt.plot( )中参数label=''传入字符串类型的值,也就是图例的名称
    plt.plot(n, m2, 'b', label='男生购物欲望')  # 使用plt.legend( )使上述代码产生效果
    plt.legend()
    

四、饼图

plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
        startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False,
        rotatelabels=False, hold=None, data=None)

pie 函数参数详解

  • x :(每一块)的比例,如果sum(x) >1会使用sum(x)归一化;
  • labels :(每一块)饼图外侧显示的说明文字;
  • explode :(每一块)离开中心距离;
  • startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
  • shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
  • labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
  • autopct :控制饼图内百分比设置,可以使用format字符串或者format function'%1.1f'指小数点前后位数(没有用空格补齐);
  • pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
  • radius :控制饼图半径,默认值为1;counterclock:指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
  • wedgeprops:字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:* * wedgeprops={'linewidth':3}设置wedge线宽为3。
  • textprops:设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
  • center:浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
  • frame:布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
  • rotatelabels:布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体
plt.style.use('fivethirtyeight')
languages = ['JavaScript', 'HTML/CSS', 'SQL', 'Python', 'Java']
popularity = [59219, 55466, 47544, 36443, 35917]

plt.pie(popularity, labels=languages, autopct='%1.1f%%',
        counterclock=False, startangle=90, explode=[0, 0.2, 0, 0, 0])

plt.title('top5 编程语言占比')
plt.tight_layout()  # 自动调整子图的尺寸使充满整个figure
plt.show()

五、柱状图

import matplotlib.pyplot as plt
import random

# 解决中文乱码问题
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams["axes.unicode_minus"] = False

# 定义x轴、y轴数据
x_data = ["20{}年".format(i) for i in range(16, 22)]
y_data = [random.randint(100, 300) for i in range(6)]

# 绘图
for i in range(len(x_data)):  # 编写渲染使柱状图颜色不同
    plt.bar(x_data[i], y_data[i])

# 添加数据标签
for i in range(len(x_data)):
    plt.text(x_data[i], y_data[i], y_data[i])

plt.title("销量分析")
plt.xlabel("年份")
plt.ylabel("销量")
plt.show()

plt.bar(x,height,[width=0.8][,align='center'][,color='blue'])

  • x:表示x坐标的取值.
  • height:条形图每个条形的高度,即y坐标的取值。
  • width:条形图每个条形的宽度,取值为0~1,默认为0.8。
  • align:将条形与x坐标对齐的方式,align='center'表示将条形底边中心置于x坐标的位置,align='edge'表示将条形的左边缘与x坐标位置对齐。
  • color:条形的颜色,默认为'blue'


并列柱状图

# 导入扩展包
import matplotlib.pyplot as plt
import numpy as np

# 构造数据
y1 = [1, 4, 6, 8, 9, 4, 3, 8]
y2 = [2, 5, 9, 5, 3, 2, 7, 4]
x = np.arange(len(y1))

# 设置柱状图的宽度
width = 0.4

# 绘图
plt.figure(figsize=(8, 4))

plt.bar(x=x, height=y1, width=width, label='Data1')
plt.bar(x=x + width, height=y2, width=width, label='Data2')

# 添加数据标签
for x_value, y_value in zip(x, y1):
    plt.text(x=x_value, y=y_value, s=y_value)

for x_value, y_value in zip(x, y2):
    plt.text(x=x_value + width, y=y_value, s=y_value)

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

推荐阅读更多精彩内容