iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解读等值线图的Python绘制方法
  • 775
分享到

解读等值线图的Python绘制方法

等值线图Python绘制等值线图Python等值线图 2023-02-01 12:02:12 775人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录等值线图的python绘制方法Python等值线图绘制,计算合适的等值线间距总结等值线图的Python绘制方法 等值线图或等高线图在科学界经常用到,它是由一些封闭的曲线组成的,来

等值线图的Python绘制方法

等值线图或等高线图在科学界经常用到,它是由一些封闭的曲线组成的,来表示三维结构表面。

虽然看起来复杂,其实用matplotlib实现起来并不难。

代码如下:

import numpy as np
import matplotlib.pyplot as plt
dx=0.01;dy=0.01
x=np.arange(-2.0,2.0,dx)
y=np.arange(-2.0,2.0,dy)
X,Y=np.meshgrid(x,y)
def f(x,y):
    return(1-y**5+x**5)*np.exp(-x**2-y**2)
C=plt.contour(X,Y,f(X,Y),8,colors='black')  #生成等值线图
plt.contourf(X,Y,f(X,Y),8)
plt.clable(C,inline=1,fontsize=10)

结果如下:

使用等值线图,在图的一侧增加图例作为图表中所用颜色的说明几乎是必需的,在上述代码最后增加colorbar()函数就可以实现。

plt.colorbar()

python等值线图绘制,计算合适的等值线间距

python按照给定坐标点进行插值并绘制等值线图


import matplotlib.pyplot as plt
import numpy as np
import math
import pandas as pd
import io
import copy

def get_gap(gap):
    gap = str(gap)
    gap_len = len(gap)
    gap_list = list(map(int, gap))
    top_value = int(gap_list[0])

    gap_bottom = top_value * (10 ** (gap_len - 1))
    gap_mid = gap_bottom + int((10 ** (gap_len - 1) / 2))
    gap_top = (top_value + 1) * (10 ** (gap_len - 1))
    gap_value = [gap_bottom, gap_mid, gap_top]

    gap_bottom_dis = abs(int(gap) - gap_bottom)
    gap_mid_dis = abs(int(gap) - gap_mid)
    gap_top_dis = abs(int(gap) - gap_top)
    range_list = [gap_bottom_dis, gap_mid_dis, gap_top_dis]

    min_i = 0
    for i in range(len(range_list)):
        if range_list[i] < range_list[min_i]:
            min_i = i
    final_gap = gap_value[min_i]
    return int(final_gap)

def interpolation(lon, lat, lst):
    # 网格插值——反距离权重法
    p0 = [lon, lat]
    sum0 = 0
    sum1 = 0
    temp = []

    for point in lst:
        if lon == point[0] and lat == point[1]:
            return point[2]
        Di = distance(p0, point)

        ptn = copy.deepcopy(point)
        ptn = list(ptn)
        ptn.append(Di)
        temp.append(ptn)

    temp1 = sorted(temp, key=lambda point: point[3])

    for point in temp1[0:15]:
        sum0 += point[2] / math.pow(point[3], 2)
        sum1 += 1 / math.pow(point[3], 2)
    return sum0 / sum1

def distance(p, pi):
    dis = (p[0] - pi[0]) * (p[0] - pi[0]) + (p[1] - pi[1]) * (p[1] - pi[1])
    m_result = math.sqrt(dis)
    return m_result

def gap_equal_line_value(min_value, max_value , n_group):
	# 计算较为合适的gap来获取最终的分界值
    n_group = int(n_group)
    gap = abs((max_value - min_value) / n_group)

    if gap >= 1:
        gap = int(math.ceil(gap))
        final_gap = get_gap(gap)
    else:
        gap_effect = np.float('%.{}g'.fORMat(1) % Decimal(gap))
        gap_effect = gap * (10 ** (len(str(gap_effect)) - 2))
        gap_multi = gap_effect / gap
        gap = math.ceil(gap_effect)
        final_gap = get_gap(gap)
        final_gap = final_gap / gap_multi
    #final_gap = np.float('%.{}g'.format(4) % Decimal(final_gap))

    bottom = min_value + final_gap

    if final_gap < 1:
        final_bottom = bottom
    else:
        if abs(bottom) >= 1:
            bottom_effect = math.ceil(abs(bottom))
            final_bottom = get_gap(bottom_effect)
        else:
            bottom_effect = np.float('%.{}g'.format(1) % (abs(bottom)))
            bottom_multi = bottom_effect / (abs(bottom))
            bottom_effect = math.ceil(bottom_effect)
            final_bottom = get_gap(bottom_effect)
            final_bottom = (final_bottom / bottom_multi)

        if bottom < 0:
            final_bottom = final_bottom * (-1)
        else:
            pass
    # print(final_bottom)
    #final_bottom = keep_decimal(final_bottom)
    equal_line_value = []
    if math.floor(min_value) >= final_bottom:
        equal_line_value.append(final_bottom-1)
    else:
        equal_line_value.append(math.floor(min_value))
    equal_line_value.append(final_bottom)

    for i in range(1, n_group-1):
        final_bottom = final_bottom + final_gap
        equal_line_value.append(final_bottom)
    final_bottom = final_bottom + final_gap
    if final_bottom <= max_value:
        equal_line_value.append(math.ceil(max_value))
    else:
        equal_line_value.append(final_bottom)
    print(equal_line_value)
    return equal_line_value


def equal_line_value(min_value, max_value, n_group):
	# 直接按照分组字数计算分界值
    n_group = int(n_group)
    gap = abs((max_value - min_value) / n_group)

    equal_line_value = []
    if gap <= 0:
        gap_flag = False #gap为0
        equal_line_value.append(max_value-1)
        equal_line_value.append(max_value+1)
    else:
        gap_flag = True
        equal_line_value.append(min_value)
        now_value = min_value
        for i in range(1, n_group):
            now_value = now_value + gap
            equal_line_value.append(now_value)
        equal_line_value.append(max_value)
    res = {
        'gap_flag': gap_flag,
        'equal_line_value': equal_line_value
    }

    return res



def contour_line_plot(grid_x_plot, grid_y_plot, f_plot, levels,x_long,y_long,n_group):
    n_group = int(n_group)

    color1 = '#74E3AD'
    color2 = '#17BD6D'
    color3 = '#05A156'
    color4 = '#038A49'
    color5 = '#165C3A'
    color6 = '#BDBDBD'
    color7= '#848484'
    color8 = '#FA58F4'
    color9 = '#FF00BF'
    color10 = '#FF0080'
    color11 = '#8A084B'
    color12 = '#3B0B24'

    Colors_all = (color1, color2, color3, color4, color5, color6, color7, color8, color9, color10, color11, color12)

    Colors = Colors_all[0:n_group]

    fig = plt.figure(figsize=(x_long,y_long))
    ax = plt.subplot()

    ax.contourf(grid_x_plot, grid_y_plot, f_plot, levels=levels, colors = Colors)

    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.spines['left'].set_visible(False)

    ax.set_xticks([])
    ax.set_yticks([])
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)

    # 输出为二进制流
    canvas = fig.canvas
    buffer = io.BytesIO()  # 获取输入输出流对象
    canvas.print_png(buffer)  # 将画布上的内容打印到输入输出流对象
    data = buffer.getvalue()  # 获取流的值
    buffer.close()
    plt.close()
    # with open('hhh.png', mode='wb') as f:
    #     f.write(data)

    return data


def contour_line(data,n_group):
    '''
    data:数组,[[x1,y1,value1],[x2,y2,value2],[x2,y2,value2],......]
    例:data = [[5,5,11],[5,25,21],[10,25,45],[10,5,5],[8,5,60]]
    n_group:分组组数
    '''
    data = pd.DataFrame(data,columns=['x', 'y', 'f'])

    min_x = data['x'].min()
    max_x = data['x'].max()
    min_y = data['y'].min()
    max_y = data['y'].max()

    # 设置等值线图大小
    x_long = 40.0
    y_long = 40.0

    lst = data.iloc[:, 0:3].values
    # 设置网格大小
    n_grid = 50
    grid_x = np.linspace(min_x, max_x, n_grid)
    grid_y = np.linspace(min_y, max_y, n_grid)

    # 得到所有网格坐标点
    data_xy_list = []
    for i in range(len(grid_x)):
        for j in range(len(grid_y)):
            data_xy_list.append([grid_x[i], grid_y[j]])
    data_xy = pd.DataFrame(data_xy_list, columns=['x', 'y'])

    # 得到所有网格坐标点和对应的值
    insert_value_list = []
    for i in range(len(data_xy)):
        value = interpolation(data_xy.iloc[i, 0], data_xy.iloc[i, 1], lst)
        insert_value_list.append([data_xy.iloc[i, 0], data_xy.iloc[i, 1], value])

    insert_data = pd.DataFrame(insert_value_list, columns=['x', 'y', 'f'])

    # 得到等值线的分界值
    equal_value_res = equal_line_value(insert_data.loc[:, ['f']].min()[0], insert_data.loc[:, ['f']].max()[0],n_group)
    equal_value_list = equal_value_res['equal_line_value']

    f_plot = insert_data.loc[:, ['f']].values.reshape(n_grid, n_grid)
    grid_y_plot, grid_x_plot = np.meshgrid(grid_y, grid_x)

    plt_msg = contour_line_plot(grid_x_plot, grid_y_plot, f_plot, equal_value_list,x_long,y_long,n_group)
    #data = data.set_index(axis.index)

    if equal_value_res['gap_flag'] == False:
        equal_value_list = [insert_data.loc[:, ['f']].min()[0]-1, insert_data.loc[:, ['f']].min()[0]]

    res = {
        # 等值线图
        'plt_msg': plt_msg, # 等值线图数据流
        'equal_value_list': equal_value_list,  # 间距,标签
        'xy_msg': [(min_x, max_x), (min_y, max_y)],  # 边界坐标
        'plot_data': data,  # 绘图点数据
        'plot_size': [x_long, y_long]
    }

    return res


if __name__ == "__main__":

    res = contour_line([[5, 5, 11], [5, 25, 21], [10, 25, 45], [10, 5, 5], [8, 5, 60]], 5)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解读等值线图的Python绘制方法

本文链接: https://www.lsjlt.com/news/193817.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解读等值线图的Python绘制方法
    目录等值线图的Python绘制方法python等值线图绘制,计算合适的等值线间距总结等值线图的Python绘制方法 等值线图或等高线图在科学界经常用到,它是由一些封闭的曲线组成的,来...
    99+
    2023-02-01
    等值线图 Python绘制等值线图 Python等值线图
  • 如何利用python绘制等高线图
    目录使用方法添加label的绘制虚线level设置颜色和线条宽度其他设置使用方法 matplotlib.pyplot.contour(*args, data=None, **kwar...
    99+
    2024-04-02
  • 怎么利用python绘制等高线图
    这篇文章主要介绍“怎么利用python绘制等高线图”,在日常操作中,相信很多人在怎么利用python绘制等高线图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用python绘制等高线图”的疑惑有所帮助!...
    99+
    2023-07-02
  • Python+matplotlib实现绘制等高线图示例详解
    目录前言1. 等高线图概述什么是等高线图?等高线图常用场景绘制等高线图步骤案例展示2. 等高线图属性设置等高线颜色设置等高线透明度设置等高线颜色级别设置等高线宽度设置等高线样式3. ...
    99+
    2024-04-02
  • python绘制折线图和条形图的方法
    本文实例为大家分享了python绘制折线图和条形图的具体代码,供大家参考,具体内容如下 最近开始写小论文啦,中间不免要作各种各样的图,学习后自己作了个小笔记,供小伙伴一起学习哦。 折...
    99+
    2024-04-02
  • python绘制散点图和折线图的方法
    本文实例为大家分享了python绘制散点图和折线图的具体代码,供大家参考,具体内容如下 #散点图,一般和相关分析、回归分析结合使用 import pandas import ...
    99+
    2024-04-02
  • Python几种绘制时间线图的方法
    目录Matplotlib 制作Plotly 绘制Excel 绘制Matplotlib 制作 Matplotlib 作为 Python 家族最为重要的可视化工具,其基本的 API 以及...
    99+
    2024-04-02
  • Python+matplotlib怎么实现绘制等高线图
    本篇内容主要讲解“Python+matplotlib怎么实现绘制等高线图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python+matplotlib怎么实现绘制等高线图”吧!1. 等高线图概...
    99+
    2023-06-21
  • python绘制饼图的方法详解
    用法 matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistan...
    99+
    2024-04-02
  • Android绘制双折线图的方法
    本文实例为大家分享了Android绘制双折线图的具体代码,供大家参考,具体内容如下 自定义View实现双折线图,可点击,点击后带标签描述,暂未实现拖动的功能,实现效果如下: 代码如...
    99+
    2024-04-02
  • python绘制直方图的方法
    本文实例为大家分享了python绘制直方图的具体代码,供大家参考,具体内容如下 用两列数据绘制直方图 #coding=gbk import xlwings as xw impor...
    99+
    2024-04-02
  • C#绘制实时曲线图的方法详解
    在终端机器上的曲线显示本打算用控件,可控件折腾好长时间也没弄顺,还是自己写的好使,记录下来后面再改进。 //绘图部分的定义 Int32 Draw_To...
    99+
    2024-04-02
  • android绘制曲线和折线图的方法
    本文实例为大家分享了android绘制曲线和折线图的具体代码,供大家参考,具体内容如下 (曲线)  (折线) 1.CurveView.java package com....
    99+
    2024-04-02
  • Python pyecharts绘制折线图详解
    一、绘制折线图 import seaborn as sns import numpy as np import pandas as pd import matplotlib as m...
    99+
    2024-04-02
  • python绘制棉棒图的方法详解
    目录案例参数总结用法: matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None, basefmt=None, botto...
    99+
    2024-04-02
  • python绘制柱形图的方法
    本文实例为大家分享了python绘制柱形图的具体代码,供大家参考,具体内容如下 #柱形图 import pandas import numpy import matplotlib...
    99+
    2024-04-02
  • python绘制柱状图的方法
    本文实例为大家分享了python绘制柱状图的具体代码,供大家参考,具体内容如下 绘制数据系列的柱状图 import numpy as np import matplotlib.pyp...
    99+
    2024-04-02
  • python绘制饼图和直方图的方法
    本文实例为大家分享了python绘制饼图和直方图的具体代码,供大家参考,具体内容如下 #饼图,常与结构分析结合使用 import pandas import numpy impo...
    99+
    2024-04-02
  • C#绘制柱状图和折线图的方法
    本文实例为大家分享了C#绘制柱状图和折线图的具体代码,供大家参考,具体内容如下 运行效果如下图: 设计上面的柱状图和折线图其实并没有什么难度,主要是各个坐标的计算,完全是精细活。...
    99+
    2024-04-02
  • Python绘制分类图的方法
    前言 遥感影像分类图一般为特定数值对应一类地物,用Python绘制时,主要在颜色的映射和对应的图例生成。 plt.matplotlib.colors.ListedColormap支持...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作