赞
踩
用 matplotlib 绘制图像,首先启动 IPython 这是对标准python的最出色的增强,并且与matplotlib紧密结合。启动后,需要与GUI 事件循环链接,这告诉ipython 在哪如何显示图表,再命令行中使用 %matplolib 魔法命令。
%matplotlib inline # 针对jupyter notebook 的
这样会关闭内联的绘图,让图形出现在你的 notebook 中,这对交互式有重要的意义。对于内联绘图,出图单元后面的单元里的命令不会影响该图,就比如说你无法用之后的命令改变已创建图的颜色啥的。但是对于其他后端比如 QT5 ,打开的是一个分离的窗口来展示图,之后的命令也会作用,因为这个图再内存中是活动的对象。
这里建议使用命令式的绘图接口,pyplot。这个接口包含全局的状态,可以非常快速简单的进行各种绘图变量的实验,面向对象的接口更适合来做大型的应用开发。
matplotlib 依靠 Pillow 库来加载图形数据。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('5.jpg')
print(img)
print(img.dtype) # uint8
# matplotlib 可以处理 float32 and utint8 ,但是任何图形的读取都要限制再uint8 的格式。
# 这与人类的眼睛有关。。。
# 对于RGB RGBA 的图形支持float32 and utint8 对于灰度图就只支持 float32 了。
# 注意格式的转换
implot = plt.imshow(img)
是叫伪色吗,可以用来增强对比,可视化你的数据更加容易。但只能处理一个通道的图像,灰度图,亮度图之类的,对于RGB 之类的就需要取出一个通道来:
'''
注意再 jupyter notebook 中,如果使用了 %matplotlib inline 是无法改变渲染后的图像
也就是说如果再之后的单元里改变是不会产生效果的,所以要放到一个单元里。
'''
img = mpimg.imread('5.jpg')
lum_img = img[:,:,0]
plt.subplot(121)
imgplot = plt.imshow(lum_img)
plt.subplot(122)
plt.imshow(lum_img,cmap='hot') # 对于亮度图,使用默认的颜色映射
imgplot.set_cmap('nipy_spectral') # 独立的更改配色方案。
查看颜色代表的值:
增强图像的对比度,或卓达指定区域的对比度,同时牺牲一些颜色变换不大或不重要的细节,找到感兴趣区域的工具就是直方图。
plt.hist(lum_img.ravel(), bins=256, range=(0.0, 1.0)) # 这个图像是经过归一化的,像素范围0-1
imgplot = plt.imshow(lum_img, clim=(0.0, 0.7)) # or set_clim() 方法来限制输出的区域
fig = plt.figure()
ax = fig.add_subplot(1, 2, 1)
imgplot = plt.imshow(lum_img)
ax.set_title('Before')
plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
ax = fig.add_subplot(1, 2, 2)
imgplot = plt.imshow(lum_img)
imgplot.set_clim(0.0, 0.7)
ax.set_title('After')
plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
再图像大小调整时,像素个数改变,就使用插值方法(更具不同的数学方法)来填充,
from PIL import Image
img = Image.open('2.png')
img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-place
imgplot = plt.imshow(img) # 使用的 Bilinear 双线性插值方法,默认
imgplot = plt.imshow(img, interpolation="nearest")
imgplot = plt.imshow(img, interpolation="bicubic") # 常用于放大
import numpy as np import matplotlib.pyplot as plt data = {'Barton LLC': 109438.50, # 过程中使用的数据 'Frami, Hills and Schmidt': 103569.59, 'Fritsch, Russel and Anderson': 112214.71, 'Jerde-Hilpert': 112591.43, 'Keeling LLC': 100934.30, 'Koepp Ltd': 103660.54, 'Kulas Inc': 137351.96, 'Trantow-Barrows': 123381.38, 'White-Trantow': 135841.99, 'Will LLC': 104437.60} group_data = list(data.values()) group_names = list(data.keys()) group_mean = np.mean(group_data) fig, ax = plt.subplots() # 首先上生成 axes.Axes 和 figure.Figure 的实例 ax.barh(group_names, group_data) # 绘制条形图 print(plt.style.available) # 控制样式,查看可用的样式的列表 ['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10'] plt.style.use('classic') # 激活样式 fig, ax = plt.subplots() ax.barh(group_names, group_data) # 重新绘制
对图进行一些微调
fig, ax = plt.subplots(figsize=(8, 4)) # 使用plt.subplot 的参数改变绘图大小
ax.barh(group_names, group_data)
labels = ax.get_xticklabels() # 获得标签
plt.setp(labels, rotation=45, horizontalalignment='right')
# 使用setp方法来修改多个属性,旋转,水平对齐
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
title='Company Revenue') # 使用set() 方法为 Axes 对象设置属性
也可以再一个 Axes 实例中绘制多个元素,只要简单的使用别的绘图方法就行。
fig, ax = plt.subplots(figsize=(8, 8)) ax.barh(group_names, group_data) labels = ax.get_xticklabels() plt.setp(labels, rotation=45, horizontalalignment='right') ax.axvline(group_mean, ls='--', color='r') # 加一条垂直线 for group in [3, 5, 8]: ax.text(145000, group, "New Company", fontsize=10, verticalalignment="center") # Now we move our title up since it's getting a little cramped ax.title.set(y=3) ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company', title='Company Revenue') ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3]) fig.subplots_adjust(right=1) # 调整子图布局。 plt.show()
print(fig.canvas.get_supported_filetypes()) # 打印支持的格式
{'eps': 'Encapsulated Postscript', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'ps': 'Postscript', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}
fig.savefig()
- transparent=True, 如果格式支持背景为透明的
- dpi,分辨率
- bbox_inches =“ tight”使图形的边界适合我们的绘图。
labels = ['G1', 'G2', 'G3', 'G4', 'G5'] men_means = [20, 35, 30, 35, 27] women_means = [25, 32, 34, 20, 25] men_std = [2, 3, 4, 1, 2] women_std = [3, 5, 2, 3, 3] width = 0.35 # the width of the bars: can also be len(x) sequence fig, ax = plt.subplots() # yerr,误差线 ax.bar(labels, men_means, width, yerr=men_std, label='Men') ax.bar(labels, women_means, width, yerr=women_std, bottom=men_means, # 堆叠 label='Women') ax.set_ylabel('Scores') ax.set_title('Scores by group and gender') ax.legend() plt.show()
import matplotlib import matplotlib.pyplot as plt import numpy as np labels = ['G1', 'G2', 'G3', 'G4', 'G5'] men_means = [20, 34, 30, 35, 27] women_means = [25, 32, 34, 20, 25] x = np.arange(len(labels)) # the label locations width = 0.35 # the width of the bars fig, ax = plt.subplots() rects1 = ax.bar(x - width/2, men_means, width, label='Men') # 这样分组啊,,学到了 rects2 = ax.bar(x + width/2, women_means, width, label='Women') # Add some text for labels, title and custom x-axis tick labels, etc. ax.set_ylabel('Scores') ax.set_title('Scores by group and gender') ax.set_xticks(x) ax.set_xticklabels(labels) ax.legend() def autolabel(rects): """Attach a text label above each bar in *rects*, displaying its height.""" for rect in rects: height = rect.get_height() ax.annotate('{}'.format(height), xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3), # 3 points vertical offset textcoords="offset points", ha='center', va='bottom') autolabel(rects1) autolabel(rects2) fig.tight_layout() plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。