百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Python优雅地可视化数据

bigegpt 2024-08-31 16:44 2 浏览

Python优雅地可视化数据

最近看《机器学习系统设计》...前两章。学到了一些用Matplotlib进行数据可视化的方法。在这里整理一下。

声明:由于本文的代码大部分是参考书中的例子,所以不提供完整代码,只提供示例片段,也就是只能看出某一部分用法,感兴趣的需要在自己的数据上学习测试。

最开始,当然还是要导入我们需要的包:

# -*- coding=utf-8 -*-
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np
import itertools

1. 画散点图

画散点图用plt.scatter(x,y)。

画连续曲线在下一个例子中可以看到,用到了plt.plot(x,y)。

而plt.xticks(loc,label)可以自定义x轴刻度的显示,第一个参数表示的是第二个参数label显示的位置loc。

plt.autoscale(tight=True)可以自动调整图像显示的最佳化比例 。

plt.scatter(x,y)
plt.title("Web traffic")
plt.xlabel("Time")
plt.ylabel("Hits/hour")
plt.xticks([w*7*24 for w in range(10)],['week %i' %w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
##plt.show()

画出散点图如下:



散点图

2. 多项式拟合并画出拟合曲线

## 多项式拟合
fp2 = np.polyfit(x,y,3)
f2 = np.poly1d(fp2)
fx = np.linspace(0,x[-1],1000)
plt.plot(fx,f2(fx),linewidth=4,color='g')
## f2.order: 函数的阶数
plt.legend(["d=%i" % f2.order],loc="upper right")
plt.show()

效果图:



曲线拟合

3. 画多个子图

这里用到的是sklearn的iris_dataset(鸢尾花数据集)。

此数据集包含四列,分别是鸢尾花的四个特征:

  • sepal length (cm)——花萼长度

  • sepal width (cm)——花萼宽度

  • petal length (cm)——花瓣长度

  • petal width (cm)——花瓣宽度

这里首先对数据进行一定的处理,主要就是对特征名称进行两两排列组合,然后任两个特征一个一个做x轴另一个做y轴进行画图。

# -*- coding=utf-8 -*-
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np
import itertools

data = load_iris()
#print(data.data)
#print(data.feature_names)
#print(data.target)

features = data['data']
feature_names = data['feature_names']
target = data['target']
labels = data['target_names'][data['target']]

print(data.data)
print(data.feature_names)

这里有一个排列组合参考代码,最后是取出了两两组合的情况。

排列组合的结果是feature_names_2包含了排列组合的所有情况,它的每一个元素包含了一个排列组合的所有情况,比如第一个元素包含了所有单个元素排列组合的情况,第二个元素包含了所有的两两组合的情况......所以这里取出了第二个元素,也就是所有的两两组合的情况

feature_names_2 = []
#排列组合
for i in range(1,len(feature_names)+1): 
 iter = itertools.combinations(feature_names,i) 
 feature_names_2.append(list(iter)) 
 print(len(feature_names_2[1]))
for i in feature_names_2[1]: 
 print(i)

下面是在for循环里画多个子图的方法。对我来说,这里需要学习的有不少。比如

  • for i,k in enumerate(feature_names_2[1]):

    这一句老是记不住。

  • for t,marker,c in zip(range(3),">ox","rgb"):

  • 比如从列表中取出某元素所在的索引的方法:

    index1 = feature_names.index(k[0]),也即 index = list.index(element) 的形式。

  • plt.subplot(2,3,1+i)

  • 比如for循环中画子图的方法:

  • 比如for循环的下面这用法:

plt.figure(1)
for i,k in enumerate(feature_names_2[1]):
 index1 = feature_names.index(k[0])
 index2 = feature_names.index(k[1])
 plt.subplot(2,3,1+i)
 for t,marker,c in zip(range(3),">ox","rgb"): 
 plt.scatter(features[target==t,index1],features[target==t,index2],marker=marker,c=c) 
 plt.xlabel(k[0]) 
 plt.ylabel(k[1]) 
 plt.xticks([]) 
 plt.yticks([]) 
 plt.autoscale() 
 plt.tight_layout() 
plt.show()

这里的可视化效果如下:



多个子图

4. 画水平线和垂直线

比如在上面最后一幅图中,找到了一种方法可以把三种鸢尾花分出来,这是我们需要画出模型(一条直线)。这个时候怎么画呢?

下面需要注意的就是

plt.vlines(x,y_min,y_max)

plt.hlines(y,x_min,x_max)

的用法。

plt.figure(2)
for t,marker,c in zip(range(3),">ox","rgb"): 
 plt.scatter(features[target==t,3],features[target==t,2],marker=marker,c=c) 
 plt.xlabel(feature_names[3]) 
 plt.ylabel(feature_names[2]) 
 # plt.xticks([]) 
 # plt.yticks([]) 
 plt.autoscale() 
 plt.vlines(1.6, 0, 8, colors = "c",linewidth=4,linestyles = "dashed")
 plt.hlines(2.5, 0, 2.5, colors = "y",linewidth=4,linestyles = "dashed")
 plt.show()

此时可视化效果如下:



水平线和竖直线

5. 动态画图

plt.ion()打开交互模式。plt.show()不再阻塞程序运行。

注意plt.axis()的用法。

plt.axis([0, 100, 0, 1])
plt.ion()for i in range(100):
 y = np.random.random() 
 plt.autoscale() 
 plt.scatter(i, y) 
 plt.pause(0.01)

可视化效果:



动态画图

相关推荐

Java 泛型大揭秘:类型参数、通配符与最佳实践

引言在编程世界中,代码的可重用性和可维护性是至关重要的。为了实现这些目标,Java5引入了一种名为泛型(Generics)的强大功能。本文将详细介绍Java泛型的概念、优势和局限性,以及如何在...

K8s 的标签与选择器:流畅运维的秘诀

在Kubernetes的世界里,**标签(Label)和选择器(Selector)**并不是最炫酷的技术,但却是贯穿整个集群管理与运维流程的核心机制。正是它们让复杂的资源调度、查询、自动化运维变得...

哈希Hash算法:原理、应用(哈希算法 知乎)

原作者:Linux教程,原文地址:「链接」什么是哈希算法?哈希算法(HashAlgorithm),又称为散列算法或杂凑算法,是一种将任意长度的数据输入转换为固定长度输出值的数学函数。其输出结果通常被...

C#学习:基于LLM的简历评估程序(c# 简历)

前言在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。准备不同的简历:image-20250528183949844查...

55顺位,砍41+14+3!季后赛也成得分王,难道他也是一名球星?

雷霆队最不可思议的新星:一个55号秀的疯狂逆袭!你是不是也觉得NBA最底层的55号秀,就只能当饮水机管理员?今年的55号秀阿龙·威金斯恐怕要打破你的认知了!常规赛阶段,这位二轮秀就像开了窍的天才,直接...

5分钟读懂C#字典对象(c# 字典获取值)

什么是字典对象在C#中,使用Dictionary类来管理由键值对组成的集合,这类集合被称为字典。字典最大的特点就是能够根据键来快速查找集合中的值,其键的定义不能重复,具有唯一性,相当于数组索引值,字典...

c#窗体传值(c# 跨窗体传递数据)

在WinForm编程中我们经常需要进行俩个窗体间的传值。下面我给出了两种方法,来实现传值一、在输入数据的界面中定义一个属性,供接受数据的窗体使用1、子窗体usingSystem;usingSyst...

C#入门篇章—委托(c#委托的理解)

C#委托1.委托的定义和使用委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托通过delegate关键字来声明。声明委托的...

C#.NET in、out、ref详解(c#.net framework)

简介在C#中,in、ref和out是用于修改方法参数传递方式的关键字,它们决定了参数是按值传递还是按引用传递,以及参数是否必须在传递前初始化。基本语义对比修饰符传递方式可读写性必须初始化调用...

C#广义表(广义表headtail)

在C#中,广义表(GeneralizedList)是一种特殊的数据结构,它是线性表的推广。广义表可以包含单个元素(称为原子),也可以包含另一个广义表(称为子表)。以下是一个简单的C#广义表示例代...

「C#.NET 拾遗补漏」04:你必须知道的反射

阅读本文大概需要3分钟。通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员Type类的GetMembe...

C#启动外部程序的问题(c#怎么启动)

IT&OT的深度融合是智能制造的基石。本公众号将聚焦于PLC编程与上位机开发。除理论知识外,也会结合我们团队在开发过程中遇到的具体问题介绍一些项目经验。在使用C#开发上位机时,有时会需要启动外部的一些...

全网最狠C#面试拷问:这20道题没答出来,别说你懂.NET!

在竞争激烈的C#开发岗位求职过程中,面试是必经的一道关卡。而一场高质量的面试,不仅能筛选出真正掌握C#和.NET技术精髓的人才,也能让求职者对自身技术水平有更清晰的认知。今天,就为大家精心准备了20道...

C#匿名方法(c#匿名方法与匿名类)

C#中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于C#匿名方法的一些重要特点和用法:特点省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法...

C# Windows窗体(.Net Framework)知识总结

Windows窗体可大致分为Form窗体和MDI窗体,Form窗体没什么好细说的,知识点总结都在思维导图里面了,下文将围绕MDI窗体来讲述。MDI(MultipleDocumentInterfac...