Python 颜色渐变三维平滑曲线 3D plot Color Gradient

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 颜色渐变三维平滑曲线 3D plot Color Gradient相关的知识,希望对你有一定的参考价值。

参考技术A

需求
给定若干三维坐标点,用平滑曲线将他们连接起来,并且颜色与第三维的绝对值相关
参考文档
https://cloud.tencent.com/developer/ask/132612

QT绘图技术paintEvent 渐变色技术

  前面说了有关反走样的相关知识,下面来说一下渐变。渐变是绘图中很常见的一种功能,它是利用颜色插值使得两个或更多颜色之间能够平滑过渡,简单来说就是可以把几种颜色混合在一起,让它们能够自然地过渡,而不是一下子变成另一种颜色。它们常被用来创建二维图形的三维效果。渐变的算法比较复杂,写得不好的话效率会很低,好在很多绘图系统都内置了渐变的功能,Qt也不例外。渐变一般是用在填充里面的,所以,渐变的设置就是在QBrush里面。 
        Qt支持三种类型的渐变,分别是线性渐变(QLinearGradient)、辐射渐变(QRadialGradient)、锥形渐变(QConicalGradient)。 

        1、线性渐变由两个控制点定义,连接这两点的线上设置一系列的颜色断点。这些断点被钳位到浮点数0和1之间,0对应第一个控制点,1对应第二个控制点,两个指定断点之间的颜色由线性插值得出。如代码(以下给出 paintEvent()函数里面的代码 ):

void MyWidget::paintEvent(QPaintEvent *event)
{ QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); QLinearGradient linearGradient(60, 50, 200, 200); 
 linearGradient.setColorAt(0.2, Qt::white); 
 linearGradient.setColorAt(0.6, Qt::green); 
 linearGradient.setColorAt(1.0, Qt::black); 
 painter.setBrush(QBrush(linearGradient)); 
 painter.drawEllipse(50, 50, 200, 150);
}

        这里0对应第一个控制点(60,50),1对应第二个控制点(200,200 ),之间用了三个颜色插值,效果如下图: 

技术分享

 

    2、辐射渐变由一个中心点、半径、一个焦点,以及颜色断点控制。中心点和半径定义一个圆。颜色从焦点向外扩散,焦点可以是中心点或者圆内的其他点。代码如下: 

void MyWidget::paintEvent(QPaintEvent *event)
{ QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); 
 QRadialGradient radialGradient(130, 130, 100, 130, 130); radialGradient.setColorAt(0.0, Qt::white); radialGradient.setColorAt(0.6, Qt::black); radialGradient.setColorAt(0.8, Qt::green); painter.setBrush(QBrush(radialGradient)); painter.drawEllipse(50, 50, 200, 150);
}

        这里QRadialGradient radialGradient(130, 130, 100, 130, 130);中前两个参数指定了中心点,第三个参数指定了半径,后两个参数指定了焦点,这里中心点和焦点是同一个点,所以看起来效果是从中心点向外均匀扩散。效果如下:

技术分享

 

        3、锥形渐变由一个中心点和一个角度定义,颜色从x轴正向偏转一个角度开始,按给定颜色断点旋转扩散。代码如下:

void MyWidget::paintEvent(QPaintEvent *event)
{ QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); 
 QConicalGradient conicalGradient(150,150, 90); conicalGradient.setColorAt(0.2, Qt::white); conicalGradient.setColorAt(0.6, Qt::green); conicalGradient.setColorAt(0.8, Qt::black); painter.setBrush(QBrush(conicalGradient)); painter.drawEllipse(50, 50, 200, 150);
}

        这里定义(150,150 )为中心点,从x轴正向开始偏转90度,然后按白绿黑旋转扩撒,效果如下:

技术分享

 

        4、那么我们如何控制我们的线条也是渐变效果呢 ? 通常我们画线是用画笔来完成的,但是QPen是接收QBrush做参数的,也就是说,你可以利用一个QBrush创建一个QPen,这样,QBrush所有的填充效果都可以用在画笔上了!代码如下:

 

void MyWidget::paintEvent(QPaintEvent *event)
{ QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); 
 QLinearGradient linearGradient(60, 50, 200, 200); 
 linearGradient.setColorAt(0.2, Qt::white); 
 linearGradient.setColorAt(0.6, Qt::green); 
 linearGradient.setColorAt(1.0, Qt::black); 
 painter.setPen(QPen(QBrush(linearGradient),5)); 
 painter.drawEllipse(50, 50, 200, 150);
}

         下来看看我们的画线的渐变效果吧!

技术分享

 技术分享


以上是关于Python 颜色渐变三维平滑曲线 3D plot Color Gradient的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何在 Plotly 中绘制具有渐变颜色的矩形?

如何用matlab画平滑曲线?

Matlab利用序列离散点绘制渐变颜色空间曲线

python使用matplotlib可视化3D柱状图(3D bar plot三维柱状图包含三个坐标轴xyz)设置zdir参数为x改变3d图观察的角度

python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置

如何对matlab plot生成的fig曲线图像进行去噪,平滑处理。