Gamer's Show

你知道人生最要紧的事是快乐不停

0%

Visualize

Seaborn

详解seaborn,各种类型的图样!
Seaborn基本是一个建立于Matplotlib基础上的一个2D绘图库。Seaborn创建在Python核心可视化库Matplotlib的基础上,它旨在作为补充,而不是替代,但是,Seaborn具有一些非常重要的函数。让无涯教程在这里看到其中的一些。函数有助于:

  • 内置用于设置matplotlib图形样式的主题
  • 可视化单变量和双变量数据
  • 拟合并可视化线性回归模型
  • 绘制统计时间序列数据
  • Seaborn与NumPy和Pandas数据结构配合良好
  • 它带有用于为Matplotlib图形设置样式的内置主题

入门

导入库&数据集

1
2
3
4
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sb
import numpy as np
  1. 默认情况下数据集作为Pandas DataFrame加载
    1
    2
    df=sb.load_dataset('tips')
    print df.head() #可以输出列表
  2. 查看可用数据集:
    1
    print sb.get_dataset_names()
  3. DataFrame以矩形网络的形式存储数据,每一行都包含一个值,每一列都是一个向量,用于保存特定变量的数据。
    行不需要包含相同数据类型的值!数字字符逻辑都可以。

简单的呈现代码!

1
2
3
4
5
6
7
def sinplot(flip=1):
x=np.linspace(0, 14, 100)
for i in range(1, 5):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
#sb.set() #更改为Seaborn的默认值,背景上会有灰色的网格,不加就是纯白色背景
sb.displot()
plt.show()

Seaborn带有自定义主题和高级页面,用于自定义和控制外观。
注释后是默认Matplotlib图,注释前是Seaborn默认图。

displot & histplot

一个对于displot&histplot呈现方式的官方文档说明

  • displot可以呈现直方图(histogram)和有层理的核密度估计图(KDE kernel density estimate),y轴是密度
  • histplot会展现一个更标准的计数直方图,y轴是计数
  • 默认情况下,distplot 使用 Freedman-Diaconis 规则,但显示的条形图不超过 50 个。histplot 完全将二进制选择委托给 numpy 的 “自动 “默认设置,它可以根据数据特征使用不同的参考规则,并且可以在大型数据集中选择非常窄的条形宽度。您可能需要指定上限(bins=50),以完全重现以前的图表。
  • 状态设置参考:
    参数 类型 含义
    hist bool 是否使用直方图
    xlabel/ylabel str x,y的坐标含义
    kde bool 是否启用核心密度估计,可以让直方图和曲线比较好地耦合,但是如果想要更好就写入stat = "density";kde曲线会溢出直方图,只覆盖histplot中数据地实际范围,更宽的范围展示可以使用kde_kws = dict(cut=3)
    rug bool 是否添加底部阴影
    stat density 纵轴默认为count 设定后为密度
    common_norm cool 若为True,则直方图高度显示频率而非计数
    ``
  • 一种直方图与曲线更好拟合的方法
    1
    2
    3
    4
    5
    sns.histplot(
    df["flipper_length_mm"], kde=True,
    stat="density", kde_kws=dict(cut=3),
    alpha=.4, edgecolor=(1, 1, 1, .4),
    )

kdeplot

  • 状态设置参考:
    参数 类型 含义
    shade bool 是否添加曲线下阴影

界面样式设置

整体图的操作

操作 代码 可设定值
主题样式 .setstyle() (双引号引出)darkgrid/whitegrid/dark/white/ticks
刻度删除 sb.despine()
缩放绘图元素、控制图比例 set_context 四个用于上下文的预设模板,基于相对大小,上下文命名:paper/notebook/talk/poster
自定义样式 传参给set_style() print(sb.axes_style)
输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{'axes.axisbelow'     : False,
'axes.edgecolor' : 'white',
'axes.facecolor' : '#EAEAF2',
'axes.grid' : True,
'axes.labelcolor' : '.15',
'axes.linewidth' : 0.0,
'figure.facecolor' : 'white',
'font.family' : [u'sans-serif'],
'font.sans-serif' : [u'Arial', u'Liberation
Sans', u'Bitstream Vera Sans', u'sans-serif'],
'grid.color' : 'white',
'grid.linestyle' : u'-',
'image.cmap' : u'Greys',
'legend.frameon' : False,
'legend.numpoints' : 1,
'legend.scatterpoints': 1,
'lines.solid_capstyle': u'round',
'text.color' : '.15',
'xtick.color' : '.15',
'xtick.direction' : u'out',
'xtick.major.size' : 0.0,
'xtick.minor.size' : 0.0,
'ytick.color' : '.15',
'ytick.direction' : u'out',
'ytick.major.size' : 0.0,
'ytick.minor.size' : 0.0}

示例:

1
sb.set_style("darkgrid", {'axes.axisbelow': False})

调色板

  1. color_palette()可以直接为绘图赋予颜色并添加更多的美学价值
    1
    seaborn.color_palette(palette=None, n_colors=None, desat=None)
  • n_colors是调色板的颜色数,如果为None,则默认值取决于如何制定调色板,默认状态下为六种颜色。
  • desat指每种颜色去饱和的比例。
  • 返回值是RGB元组的列表
  • 现成调色板:Deep``muted``bright``pastel``dark``colorblind
  1. seaborn.palplot()将调色板绘制为水平阵列。

定性调色板

1
2
3
current_palette=sb.color_palette()
sb.palplot(current_palette) #用于水平绘制颜色阵列
plt.show()

默认会看到六种颜色,可以给n_color传参来查看所需颜色的数量

顺序调色板

顺序图适合于表示范围内从相对较低值到较高值的数据分布
给color参数上加一个“s”会绘制顺序图

1
2
3
current_palette=sb.color_palette()
sb.palplot(sb.color_palette("Greens"))
plt.show()

分散调色板

不同的调色板使用两种不同的颜色,每种颜色代表值从任一方向上的公共点变化。
假定绘制范围为-1到1的数据,值-1到0代表一种颜色,0到+1代表另一种颜色。
默认情况下,值从零开始居中,您可以通过传递值来使用参数中心来控制它。

1
2
3
current_palette=sb.color_palette()
sb.palplot(sb.color_palette("BrBG", 7))
plt.show()

其中7表示调色板上有七种颜色。

设置默认调色板

函数 color_palette()具有一个名为 set_palette()的函数。
set_palette()color_palette()的参数相同,但默认的Matplotlib参数已更改,因此调色板可用于所有绘图

1
2
3
4
5
6
7
8
9
10
def sinplot(flip=1):
x=np.linspace(0, 14, 100)
for i in range(1, 5):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

import seaborn as sb
sb.set_style("white")
sb.set_palette("husl")
sinplot()
plt.show()

绘制单变量分布

seaborn可以帮助理解数据的单变量分布
seaborn.sidtplot()提供最快查看单变量分布的方法,可以绘制适合数据和密度估计的直方图。

参数 remark
data 一维数组或列表
bins hist bins的规格
hist bool
kde bool

matplotlib画入pyqt5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import sys
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

class MatplotlibWindow(QMainWindow):
def __init__(self):
super().__init__()

self.initUI()

def initUI(self):
self.setWindowTitle('Matplotlib in PyQt')

# 创建Matplotlib图形
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)

# 创建一个垂直布局并将Matplotlib图形添加到其中
layout = QVBoxLayout()
layout.addWidget(self.canvas)

# 创建一个QWidget并将布局设置为其主布局
main_widget = QWidget(self)
main_widget.setLayout(layout)
self.setCentralWidget(main_widget)

# 创建一个Matplotlib子图
self.ax = self.figure.add_subplot(111)
self.ax.set_title('Matplotlib in PyQt')

# 绘制一个简单的图形
self.ax.plot([1, 2, 3, 4], [10, 5, 20, 8])

# 更新Matplotlib图形
self.canvas.draw()

def main():
app = QApplication(sys.argv)
window = MatplotlibWindow()
window.show()
sys.exit(app.exec_())

if __name__ == '__main__':
main()

ITK

ITK在cmake上配置的一个非常棒的教程

VTK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np
import nibabel as nib
from ipywidgets import interact, interactive, IntSlider, ToggleButtons
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
#%matplotlib inline
import seaborn as sns
sns.set_style('darkgrid')

def explore_3dimage(layer):
plt.figure(figsize=(10, 5))
plt.imshow(image_data[:, :, layer], cmap='gray');
plt.title('Explore Layers of adrenal', fontsize=20)
plt.axis('off')
return layer

image_path = "./brain1_image.nii.gz"
image_obj = nib.load(image_path)
print(f'Type of the image {type(image_obj)}')

image_data = image_obj.get_fdata()
type(image_data)

height, width, depth = image_data.shape
print(f"The image object height: {height}, width:{width}, depth:{depth}")
print(f'image value range: [{image_data.min()}, {image_data.max()}]')
print(image_obj.header.keys())

pixdim = image_obj.header['pixdim']
print(f'z轴分辨率: {pixdim[3]}')
print(f'in plane 分辨率: {pixdim[1]} * {pixdim[2]}')

z_range = pixdim[3] * depth
x_range = pixdim[1] * height
y_range = pixdim[2] * width
print(x_range, y_range, z_range)

maxval = 25
i = np.random.randint(0, maxval)
# Define a channel to look at
print(f"Plotting z Layer {i} of Image")
plt.imshow(image_data[0, :, :], cmap='gray')
plt.axis('off');

#interact(explore_3dimage, layer=(0, image_data.shape[-1]));
plt.show()

Vedo

Mesh

Mesh模型是一种用于描述三维物体表面的数学表示方法。它由一系列顶点(vertices)和连接这些顶点的线段或面片(faces)组成。每个顶点具有其在三维空间中的坐标位置,而每个面片则由一组顶点索引构成,定义了一个平面。
在Mesh模型中,可以使用不同的数据结构来表示顶点和面片之间的关系,常见的包括三角形网格(triangle mesh)和四边形网格(quadrilateral mesh)三角形网格是最常用的一种,它由三个顶点和一个法线向量(用于确定面片的朝向)组成。四边形网格则由四个顶点和一个法线向量构成。
除了顶点和面片信息,Mesh模型还可以包含其他属性,如颜色、纹理坐标、法线向量等。这些属性可以为模型添加更多的细节和真实感。
常使用.ply格式的文件存放mesh模型

一点报错

VTK

module ‘backend_interagg’ has no attribute ‘FigureCanvas’. Did you mean: ‘FigureCanvasAgg’?

解决:加入代码

1
2
import matplotlib
matplotlib.use('TkAgg')

解释
matplotlib.use('TkAgg') 这行代码是用于设置 Matplotlib 库的后端。后端是用于实现图形绘制和用户界面的库。Matplotlib 支持多种后端,例如 ‘TkAgg’‘Qt5Agg’‘GTK3Agg’ 等。

在这行代码中,‘TkAgg’ 是后端的名称,而 matplotlib.use() 函数用于指定使用哪种后端。在这个例子中,你告诉 Matplotlib 使用 ‘TkAgg’ 后端。

Matplotlib 默认使用 ‘TkAgg’ 后端,但有时你可能希望更改默认后端以利用特定 GUI 工具包的特性。例如,如果你希望使用 Qt5 而不是 Tkinter,你可以通过调用 matplotlib.use('Qt5Agg') 来实现。

需要注意的是,更改后端会影响所有后续的图形绘制,因此如果你在代码的不同部分使用不同的后端,你需要在每个需要使用特定后端的代码部分之前调用 matplotlib.use()

Vedo

AttributeError: ‘vtkmodules.vtkFiltersCore.vtkQuadricDecimation’ object has no attribute ‘MapPointDataOn’

提问区链接

1
pip install -U git+https://github.com/marcomusy/vedo.git

‘set’ object has no attribute ‘name’