matplotlib常规操作

一些有意思的图

1,指定图片大小和像素

Python绘图问题:Matplotlib中指定图片大小和像素

2,绘图命令的基本架构及其属性设置

绘图与可视化

3,python基础语法(二)——— plt的一些函数使用

plt的用法

4,统一图上所有字体

plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 15
统一字体

5,取消边框 plt.axis('off')

plt.axis('off')

6,保存图片不完整 plt.savefig('test.png', dpi=300, bbox_inches='tight')

在savefig多加一个参数 bbox_inches='tight' 就可以了
plt.savefig('test.png', dpi=300, bbox_inches='tight')

7,调整图例的位置及大小 plot.legend(loc=2,prop={'size':6})

matplotlib图例legend语法及设置的方法
matplotlib6 -- 添加 图例 legend
可以不用在plot()中加label=。。,直接plt.legend([...]),就可以生成对应图例
限制图例的大小

plot.legend(loc=2,prop={'size':6})

8,横坐标挤到了一起

(1) 调整字体+旋转
plt.tick_params(labelsize=13, rotation=45) 横纵坐标都调整
plt.xticks(rotation=90, fontsize=14) 只调整横坐标
(2) 调整 x 轴坐标轴密度
import matplotlib.ticker as ticker
fig, ax = plt.subplots(1, 1)
。。。
tick_spacing = 10
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
一次python画图经历

9,python pyplot绘制并行柱状图,x轴数值显示在两个柱状图的中心

https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/114057980

10,matplotlib绘制双纵坐标图

plt.rcParams['font.family'] = 'Times New Roman'
figure, ax1 = plt.subplots()
。。。
ax2 = ax1.twinx()
。。。
https://blog.csdn.net/a486259/article/details/105027516/

11,双纵坐标图合并图例

figure, ax1 = plt.subplots()
。。。
ax2 = ax1.twinx()
。。。
leg = figure.legend(loc='upper left', prop=legendFont, fancybox=False) #figure是关键
。。。
https://www.cnblogs.com/Atanisi/p/8530693.html

12,垂直于坐标轴的图-棉棒图 plt.stem()

(markerline, stemlines, baseline) = plt.stem(x, timeMeanList, label='Mean Time', linefmt='--')
plt.setp(baseline, visible=False) #棉棒图隐藏基线
https://blog.csdn.net/weixin_41869644/article/details/107428880

13,修改刻度

https://fishc.com.cn/thread-172770-1-1.html

14,三维绘图

https://blog.csdn.net/qq_34024346/article/details/108221426
https://www.cnblogs.com/tensorzhang/p/14922023.html
https://blog.csdn.net/jasonzhoujx/article/details/81780774
https://blog.csdn.net/u014636245/article/details/82799573
https://www.cnblogs.com/xingshansi/p/6777945.html

15,subplot子图坐标轴重叠 plt.tight_layout(),subplots_adjust

from pylab import *
subplots_adjust(left=0.0,bottom=0.0,top=1,right=1)
for i in range(1,5):
    subplot(2,2,i)
    text(0.5,0.5,str(i))
show()

left,bottom,top,right四个参数用来控制上下左右的空白;注意这里面是从figure的左下角开始标记,取值从0-1;top和right的取值也是以左下角为坐标原点计数,并不是表示到最上方和最右边的比例。比如top=0.9表示给上面留下0.1的空白。wspace和hspace的分别控制子图之间的列距和行距。

16,绘制混淆矩阵以及横纵坐标显示中文 plt.imshow()

# plt.rcParams两行是用于解决标签不能显示汉字的问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#coding=utf-8
import matplotlib.pyplot as plt
import numpy as np

confusion = np.array(([91,0,0],[0,92,1],[0,0,95]))
# 热度图,后面是指定的颜色块,可设置其他的不同颜色
plt.imshow(confusion, cmap=plt.cm.Blues)
# ticks 坐标轴的坐标点
# label 坐标轴标签说明
indices = range(len(confusion))
# 第一个是迭代对象,表示坐标的显示顺序,第二个参数是坐标轴显示列表
#plt.xticks(indices, [0, 1, 2])
#plt.yticks(indices, [0, 1, 2])
plt.xticks(indices, ['圆形', '三角形', '方形'])
plt.yticks(indices, ['圆形', '三角形', '方形'])

plt.colorbar()

plt.xlabel('预测值')
plt.ylabel('真实值')
plt.title('混淆矩阵')

# plt.rcParams两行是用于解决标签不能显示汉字的问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 显示数据
for first_index in range(len(confusion)):    #第几行
    for second_index in range(len(confusion[first_index])):    #第几列
        plt.text(first_index, second_index, confusion[first_index][second_index])
# 在matlab里面可以对矩阵直接imagesc(confusion)
# 显示
plt.show()

python 作图:heatmap

17,默认配色'Cn'

https://blog.csdn.net/mighty13/article/details/113764337
默认色彩循环,Cn彩色定义:由字符串C和1个非负整数构成,数字为默认色彩循环rcParams["axes.prop_cycle"]的索引,
rcParams["axes.prop_cycle"] (default: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])),数字超过9,对应的颜色索引为数字个位数索引,例如C101和C1的取值相同。注意C必须为大写。

'''例子1'''
import matplotlib.pyplot as plt

for i in range(20):
    line = plt.plot([i, i])
    c = line[0].get_color()
    plt.annotate(repr(i) + ":"+c, (0, i+0.1))
plt.show()
'''例子2'''
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

tab10 = mcolors.TABLEAU_COLORS
for i,j in enumerate(tab10):
    plt.plot([i, i], c=j)
    plt.annotate(j+":"+tab10[j], (0, i+0.1))
plt.show()
'''例子3, 默认色彩用'C0'...,总共有10个,数字超过9,对应的颜色索引为数字个位数索引,例如C101和C1的取值相同。注意C必须为大写。'''
import matplotlib.pyplot as plt

for i in range(20):
    plt.plot([i, i], c=f'C{i}')
    plt.annotate(f'c{i}', (0, i+0.1))
plt.show()

18,非阻塞模式绘图(plt.pause())

  • 关键:plt.cla()/plt.figure(), plt.pause(), plt.show()放在最后
  • python可视化库matplotlib的显示模式默认为阻塞(block)模式;也就是在plt.show()之后,程序会暂停到那儿,并不会继续执行下去;如果需要继续执行程序,就要关闭图片。
  • 那如何展示动态图或多个窗口呢?这就要使用plt.ion()这个函数,使matplotlib的显示模式转换为交互(interactive)模式。即使在脚本中遇到plt.show(),代码还是会继续执行。
  • 在plt.show()之前一定不要忘了加plt.ioff(),如果不加,界面会一闪而过,并不会停留。
    import matplotlib.pyplot as plt
    plt.cla()    #清空之前所绘制的图
    plt.pause()  #显示所绘制的图
    '''这俩才是关键'''
    import matplotlib.pyplot as plt
    plt.ion()    # 打开交互模式
    # 同时打开两个窗口显示图片
    plt.figure()  #图片一
    plt.imshow(i1)
    plt.figure()    #图片二
    plt.imshow(i2)
    # 显示前关掉交互模式
    plt.ioff()
    plt.show()
'''一个例子'''
import torch
import torch.nn as nn
from matplotlib import pyplot as plt
from tqdm import tqdm
import math

dataIn = torch.randn(1, 1000)
dataTarget = torch.cat([torch.arange(1, 501).to(torch.float)[None, :], torch.arange(500, 0, -1).to(torch.float)[None, :]], dim=1)
# dataTarget = torch.sin(torch.linspace(0, 4*math.pi, 1000))[None, :]
myNet = nn.Linear(1000, 1000)
optimizer = torch.optim.Adam(myNet.parameters(), lr=0.01)
loss = nn.PairwiseDistance(p=2)

plt.ion()   #打开交互模式
plt.plot(dataIn[0], label='dataIn')
plt.plot(dataTarget[0], label='dataTarget')
plt.legend(loc=1)
for i in tqdm(range(1000)):
    myNet.train()
    optimizer.zero_grad()
    l = loss(myNet(dataIn), dataTarget).mean()
    l.backward()
    optimizer.step()
    plt.cla()   #将之前的图清空
    plt.plot(myNet(dataIn).detach()[0], label='dataIn')
    plt.plot(dataTarget[0], label='dataTarget')
    plt.legend(loc=1)
    plt.title(f'epoch{i}')
    plt.pause(0.01) #必须有,否则不显示图案
plt.ioff()  #关闭交互模式
plt.show()  #在最后画面阻塞

19,增添文字注释、箭头(plt.text(x,y,text,fontsize) plt.arrow(x,y,dx,dy,width,fc) plt.annotate())

title、annotate、text常用参数,以及文本框、数学公式的插入方法
https://blog.csdn.net/weixin_43327597/article/details/110309594
https://blog.csdn.net/DeniuHe/article/details/86670575

20,局部放大图

https://blog.csdn.net/wulishinian/article/details/106668011

21,调整图案尺寸(长宽比):plt.rcParams['figure.figsize'] = (12.0, 2.0)

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,50,100)
y = np.exp(x)
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['lines.linestyle'] = '--'
plt.rcParams['figure.figsize'] = (12.0, 2.0)
plt.plot(x,y,color='r',label='exp1')
plt.legend()
plt.show()

22,调整横纵坐标值:plt.xticks(range(3), ['50', '100', '150'])

23,python自动化提取图片配色

from haishoku.haishoku import Haishoku
image = 'test.png'
haishoku = Haishoku.loadHaishoku(image)
#获取图片的主色调
print(haishoku.dominant)
#打开一个临时文件,用来预览主色调的颜色
Haishoku.showDominant(image)
#获取配色方案,返回一个结构为:[(R, G, B), (R, G, B), …] 最大长度为8的数组。
pprint.pprint(haishoku.palette)
#打开一个临时文件,用来预览图片配色方案。(不会保存在本地)
Haishoku.showPalette(image)
# 另外,Haishoku库从v1.1.4版本后,支持从 url 中直接加载图像。
imagepath = 'https://img-blog.csdnimg.cn/20190222215216318.png'
haishoku = Haishoku.loadHaishoku(imagepath)

https://mp.weixin.qq.com/s/woxJ7yx5Fb9a36_10SUxjw

24,绘制雷达图

https://blog.csdn.net/zx1245773445/article/details/96992357

25,格式美化

plt.style.use('bmh')
# plt.style.available 查看有哪些格式可用,感觉'bmh'还挺好看的

一些技巧帖子

技巧总结1
技巧总结2
https://mp.weixin.qq.com/s/OWa3OBRoAeEOOMCXOtl9jQ
技巧总结3-c语言中文网
等高线绘制决策边界1

等高线绘制决策边界2

posted @ 2021-03-25 10:06  tensor_zhang  阅读(514)  评论(0编辑  收藏  举报