python 可视化 plotly 画3dmesh网格图

最近在工作中遇到python 打印可视化3D图。需求是根据以下CSV文件黄色高亮的三列打印3D立体网格图,尝试过用matplotlib打印出来的效果不是很好。

发现了非常强大的可视化包plotly。但是plotly没有打印出四边形网格的函数,只有三角形网格trisurf,所以四边形网格需要自己去画。
附上plotly 官方文档链接 https://plot.ly/python/
首先安装plotly包:
pip install plotly
基本思路如下:

  1. 首先画出同一个X轴上不同Y轴在Z轴上的点,分别连线,其中X轴是Speed,Y轴是Torque, Z轴是功率。对CSV进行排序,转变成dataframe,X的误差范围在正负10,即对于X相差在10以内都放在一个数据块dataframe中,用while循环获取每个小数据块,放入数据字典中。遍历数据字典,取出对应的x2,y2,z2,画点并对每个数据块中的点连线。
    2.其次画同一个y轴坐标上的不同x轴坐标点在三维空间上的线性图,利用上面的每一个数据块的相同index及其不同坐标点放入字典Key-value中。之后遍历该字典,对每个item画点(X3,y3,z3)和线。这个做法有一个缺点,即每个数据块的大小可能不相等,多出来的点并没有连线画图。
  2. 最后将最初文件中的dataframe中的第1,2,3列取出(x1,y1,z1)画Mesh3d,为网格画颜色平面图。
# -*- coding:utf8 -*-
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from collections import defaultdict
import plotly.offline as py  # 设置离线画图"""
打开原始CSV文件数据,必须保证csv 文件只有一行列名,并且检查输入查询的列名是否存在于文件中,存在则返回正确的列名用于坐标轴标签若存在,则提取这些列的数据,返回新的dataframe,若不存在,则报错不执行程序返回值: new_Df, correct_list
"""
def check_file_column():input_file = input('请输入csv文件路径:')filename = input_file.strip()with open(filename, 'rb') as f:csv_data = pd.read_csv(f, encoding='gb2312')if len(csv_data.columns) != 3:print('文件列名不等于3列,请修改文件!')exit()correct_list = list(csv_data.columns.values)# 删除空的数据行new_Df = csv_data.dropna()# 将导入的各个类型变成正确的类型new_Df[new_Df.columns.values[0]] = new_Df[new_Df.columns.values[0]].apply(int)new_Df[new_Df.columns.values[2]] = new_Df[new_Df.columns.values[2]].apply(float)new_Df[new_Df.columns.values[1]] = new_Df[new_Df.columns.values[1]].apply(float)# 将new_Df进行排序new_Df.sort_values(new_Df.columns.values[0], inplace=True)return new_Df, correct_list"""使用递归对input dataframe 进行处理,每次返回删除指定数据后的dataframe和需要删除的dataframe列表"""
def get_blockdata(csv_data_copy,sorted_pd_list):while csv_data_copy.size != 0:min_value = csv_data_copy.iloc[:, 0].min()# 筛选转速Speed的误差值在正负10之内,并组成新的dataframediff_value_1 = min_value - 10diff_value_2 = min_value + 10pd_block = csv_data_copy[(csv_data_copy[csv_data_copy.columns.values[0]] > diff_value_1) & (csv_data_copy[csv_data_copy.columns.values[0]] < diff_value_2)]# 将pd_block按照Torque排序pd_block.sort_values(pd_block.columns.values[1], inplace=True)pd_block.reset_index(drop=True, inplace=True)# 将每个pd_block添加到一个sorted_pd list中sorted_pd_list.append(pd_block)# 从csv_data中删除pd_block的数据csv_data_copy.drop(csv_data_copy[(csv_data_copy[csv_data_copy.columns.values[0]] > diff_value_1) & (csv_data_copy[csv_data_copy.columns.values[0]] < diff_value_2)].index,inplace=True)return csv_data_copy, sorted_pd_list"""
提取CSV_data的数据,分别画网格线和3D平面图:
x1,y1,z1 用于画3D mesh 图
x2,y2,z2 用于画同一个x轴坐标上的不同y轴坐标点在三维空间上的线性图
x3,y3,z3 用于画同一个y轴坐标上的不同x轴坐标点在三维空间上的线性图"""
def handle_data_plot_3D(csv_data, correct_list):# x1,y1,z1 用于画3D mesh 图x1 = np.array(list(csv_data.iloc[:, 0].values))y1 = np.array(list(csv_data.iloc[:, 1].values))z1 = np.array(list(csv_data.iloc[:, 2].values))# 将每个相同X值得数据提取放入一个pandas中csv_data_copy = csv_data# 用于存出每个数据块pandas数据sorted_pd_list = []csv_data_copy, sorted_pd_list = get_blockdata(csv_data_copy, sorted_pd_list)lines = []line_marker = dict(color='black', width=0.8)# 画同一个x轴坐标上的不同y轴坐标点在三维空间上的线性图for each in sorted_pd_list:x2 = np.array(list(each.iloc[:, 0].values))y2 = np.array(list(each.iloc[:, 1].values))z2 = np.array(list(each.iloc[:, 2].values))lines.append(go.Scatter3d(x=x2, y=y2, z=z2, mode='lines', line=line_marker, showlegend=False,hoverinfo='none'))# 用于存储每个数据块中相同index的数据字典x_y_z_row = defaultdict(list)for _ in sorted_pd_list:for index, row in _.iterrows():x_y_z_row[index].append([row[0], row[1], row[2]])# 提取每一数据块的x, y,z坐标字典each_index_x = defaultdict(list)each_index_y = defaultdict(list)each_index_z = defaultdict(list)for key, value in x_y_z_row.items():for each in value:each_index_x[key].append(each[0])each_index_y[key].append(each[1])each_index_z[key].append(each[2])# 遍历每个数据块的x,y,z坐标字典,每个块进行描点和画图for key, value in each_index_x.items():if key in each_index_y.keys() and key in each_index_z:x3 = valuey3 = each_index_y[key]z3 = each_index_z[key]lines.append(go.Scatter3d(x=x3, y=y3, z=z3, mode='lines', line=line_marker, showlegend=False, hoverinfo='none'))fig = go.Figure(data=lines)fig.add_trace(go.Mesh3d(x=x1, y=y1, z=z1, opacity=0.80,intensity=z1,colorbar={"title": correct_list[2], "len": 0.6, },hoverinfo='x+y+z',colorscale='Portland',))fig.update_layout(title='3D_Mesh_Grid plotly', autosize=False,width=900, height=900,margin=dict(l=65, r=50, b=65, t=90),scene=dict(xaxis_title=correct_list[0],yaxis_title=correct_list[1],zaxis_title=correct_list[2],))fig.show()py.plot(fig, filename='pictures/3Dfigure.html',  # 会生成一个网页文件image='png', )  # 设置保存的文件类型,不会在本地有个png的文件,需要在生成的网页打开另存为png的文件def main():# check columns and check filescsv_data, correct_list = check_file_column()# 处理数据画网格图以及3Dmesh 图handle_data_plot_3D(csv_data, correct_list)if __name__ == '__main__':main()

没有画颜色填充平面的只有网格效果的如下:

最后整个图形效果如下:

python 可视化 ploty 画3dmesh网格图相关推荐

  1. Python实践:画个动图玩玩,Python绘制GIF图总结

    Python实践:画个动图玩玩,Python绘制GIF图总结 文章目录 Python实践:画个动图玩玩,Python绘制GIF图总结 具体实现 Python代码 参考资料 上期博客< Pytho ...

  2. 【python】如何画简单的图

    [python学习]画简单的图 一般是引用turtle这个函数库来画图,这个画图就好像一个乌龟在白纸上爬,其爬行轨迹就是所画的图形. 一些基本的语句: import turtle 用来引用turtle ...

  3. Python可视化数据画直线的几种方法

    利用Python可视化数据主要是利用Numpy Matplotlib强大的绘图功能,还可以利用Pandas进行数据挖掘和数据分析 在学习的过程中发现了直线的画图方法有以下几种: 1. 直接plot法 ...

  4. python画饼图-从零开始学Python可视化(五): 饼图及环形图

    我们之前已经接触过了饼图,它主要用于表现比例.份额类的数据,今天我们在样式上进行更多的探索. 我们以笔记本行业来作为例子.假设笔记本电脑行业有ABCD五家公司,他们在2017年的国内市场份额分别为45 ...

  5. python画饼状图的包_Python数据可视化:画饼状图、折线图、圈图

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. from math import pi import matplotlib ...

  6. Matlab关于画数据网格图

    1.surf(Z): Z为一个矩阵,如果Z是向量,那么就需要先将其转换为矩阵 reshape(Z,[length(X),length(Y)]);  X和Y为你的横坐标取值个数. 具体代码调用格式如下 ...

  7. python:mplfinance 画K线图

    python的 mpl_finance模块从2020年已经提醒弃用,2021年现在用 mplfinance模块. 安装 pip install --upgrade mplfinance mpf_kli ...

  8. [python] Jupyter Notebook 画股票折线图

    1. Jupyter Notebook 是一个web python应用程序,它可以支持实时代码和画图 安装命令如下 pip install jupyter -i https://pypi.douban ...

  9. MATLAB 画颜色网格图

    作图代码 clear; clc; %%%%%%%%画网格%%%%%%%% [m,n]=meshgrid(0:100);%100*100的网格 %%%%%%%%作图%%%%%%%% A=load('D: ...

最新文章

  1. python_redis模块
  2. Ubuntu18.04 给整个目录及子目录赋权限
  3. Web前端开发薪资待遇及发展前景解读
  4. 阿里云云效如何帮助企业10倍研发效能提升?
  5. python382怎么用_用python做UDP连接
  6. 发送ActivityFeed的隐藏功能
  7. gulpfile php,Laravel利用gulp如何构建前端资源详解
  8. 腾讯云linux vnc端口,用腾讯云手把手教你用VNC搭建Ubuntu可视化界面(一)
  9. Delphi 与 DirectX 之 DelphiX(49): TDIB.DoGrayScale;
  10. 【思考人生】大学(专科)三点五个学期的总结
  11. 一个普普通通大四学生的2021
  12. Java、JSP医院药库管理系统
  13. 在浏览器中播放m3u8
  14. 学习笔记—前端移动端开发知识点总结
  15. n维球体,n维椭球体体积公式证明
  16. 阳光沙滩博客系统后端api
  17. react ant-design自定义图标
  18. 云服务器ECS使用记录-1. 介绍
  19. 一位沪漂 11 年的程序员老兵,回老家了!
  20. STM32F427主控(大疆A板)+K210视觉处理

热门文章

  1. 几行代码爬取喜马拉雅音乐
  2. Vue+Echarts地图消失(高度变成0)的完美解决方案
  3. 计算机音乐代表人物,在你的周围,一定有许多名人吧!比如:故事大王xxx,电脑高手xxx,音乐家xxx……请你选择其中一...
  4. 数据分析:大数据时代的必备技能之EXCEL
  5. 画E-R图·数据库笔记(四)
  6. Mac上面有哪些宝藏的软件
  7. ELK学习笔记之F5 DNS可视化让DNS运维更安全更高效-F5 ELK可视化方案系列(3)
  8. zigbee3.0 ota 实验
  9. OpenGL学习脚印:伽马校正(Gamma Correction)
  10. MNF最小噪声分离变换