欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

组织分享活动-hebut

程序员文章站 2022-05-04 13:09:20
一:开篇介绍林老师好,曹老师好,王老师好,各位同学好。我是林涛老师课题组的学生,我今天分享的是利用python对数据可视化。总所周知python的强大主要是依靠其第三方的包,在数据可视化图这一块python最基础的包是matplotlib,除了这个之外还有Seaborn, Plotly我今天分享的流程是:分享python有哪些用于可视化的第三方库,这个刚刚已经完成,大概有10种常用的且成熟的可视化库,百度搜十大 python 可视化第三方包可以找到。对其中的matplot库进行一些图形的绘制,....

一:开篇介绍

林老师好,曹老师好,王老师好,各位同学好。

我是林涛老师课题组的学生,我今天分享的是利用python对数据可视化。总所周知python的强大主要是依靠其第三方的包,在数据可视化图这一块python最基础的包是matplotlib,除了这个之外还有Seaborn, Plotly

我今天分享的流程是:

  • 分享python有哪些用于可视化的第三方库,这个刚刚已经完成,大概有10种常用的且成熟的可视化库,百度搜十大 python 可视化第三方包可以找到。
  • 对其中的matplot库进行一些图形的绘制,让大家有一个基本的了解,能够达到看到源代码可以简单的修改。
  • 分享一些常用的图形,以及图形对应的源码,这样以后碰到有想画的图,就去找一找,然后把源码复制来进行修改,改成自己想要的,而不是自己重新从0开始写。
  • 对最近刚出来的一些IEEE和SCI绘图神器进行一些demo的演示,这个库还没有完全成熟,python开源社区正在努力的完善他,利用这个库可以更加方便的画出符合IEEE等杂志要求的图形。

二:利用matplot库进行一些图形的绘制

这个绘制我打算从一个最简单的画一个点开始,然后逐步的画出一个相对完整的图。

如何画出一些点。

  • 首先生成一些点,也就是生成一些横纵坐标。这里我们利用python的random函数来随机生成一些点。我们生成的点数为10个,让其横坐标符合正太分布。

  • 定义一块画布

  • 利用plt.scatter在这个画布上绘图

  • 让这个图像显示出来

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

mpl.rcParams['font.sans-serif'] = [u'SimHei']#用来显示正常的中文标签
mpl.rcParams['axes.unicode_minus'] = False#用来显示正常的符号

#定义数据
x1 = np.random.randn(10) #取随机数  取出10个 符合正太分布
x2 = x1 + x1**2 - 10

#确定画布 - 当只有一个图的时候,不是必须存在
plt.figure(figsize=(8,4))

#绘图
plt.scatter(x1,x2 #横坐标,纵坐标
            ,s=50 #数据点的尺寸大小
            ,c="red" #数据点的颜色
            ,label = "Red Points"
           )
plt.show() #让图形显示

组织分享活动-hebut

如何画出两拨点点

首先两拨点点需要包含几个元素? 应该是三个元素,分别横坐标,纵坐标,属于哪一波。

和刚才一样还是需要先把这三个元素造出来,和刚才比较多了一个每个元素所属类型的信息。

  • 构造出比上次多的那个信息
  • 分批画图,有几种类型就画几次,(为什么这么做,因为画点用的scatter函数,每次只能选择一种颜色),这样的话图中需要三种颜色,就需要分三批。
  • 技巧是如何根据所属类型的不同,把横纵坐标分出来,这个知识点不算数严格的今天的可视化的讨论的技术,但是可视化的时候总是需要用到。我先举个例把这个地方说明白一下。
import numpy as np
x=np.array([1,-2,3,-4,5,-6,7,-8,9])
y=np.array([0,1,0,1,0,0,1,1,1])
print([y==0])
print(x[y==0])
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

mpl.rcParams['font.sans-serif'] = [u'SimHei']#用来显示正常的中文标签
mpl.rcParams['axes.unicode_minus'] = False#用来显示正常的符号

#定义数据
x1 = np.random.randn(10) #取随机数  取出10个 符合正太分布
x2 = x1 + x1**2 - 10


y = np.array([0,0,1,1,0,1,0,1,0,0])

colors = ["red","black"] #确立颜色列表
labels = ["Zero","One"] #确立标签的类别列表

#确定画布 - 当只有一个图的时候,不是必须存在
plt.figure(figsize=(8,4))

#绘图
for i in range(len(labels)):
    plt.scatter(x1[y==i],x2[y==i] #横坐标,纵坐标
                ,s=50 #数据点的尺寸大小
                ,c=colors[i] #数据点的颜色
                ,label =labels[i]
               )
plt.legend()
plt.show() #让图形显示

组织分享活动-hebut

画出美国各个城市的人口数量图

画图之前我首先说明数据集,包括数据集的大小和数据集所包含的信息

这个数据集有322条组成(323-1标题)

包含的信息有

["城市ID","郡","州","面积","总人口","人口密度","白人人口","非裔人口","美洲印第安人人口","亚洲人口","其他人种人口"                   ,"白人所占比例","非裔所占比例","美洲印第安人所占比例","亚洲人所占比例","其他人种比例"                   ,"成年人口","具有高中文凭的比率","大学文凭比例","有工作的人群比例"                   ,"已知贫困人口","已知贫困人口的比例","贫困线以下的人的比例","贫困线以下的儿童所占比例","贫困的成年人所占的比例","贫困的老年人所占的比例"                   ,"是否拥有地铁","标签","点的尺寸","c1","c2","c3"]
数据集读取

1.读取数据集,并查看数据集的信息,这些信息也不是所有的都要用,我们要的其实就是美国的城市名称,城市的面积,这个城市的标签(这个标签好像就是 贫困程度)

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

mpl.rcParams['font.sans-serif'] = [u'SimHei']#用来显示正常的中文标签
mpl.rcParams['axes.unicode_minus'] = False#用来显示正常的符号

midwest = pd.read_csv(r"./dataSet/midwest_filter.csv")
print(midwest.shape)#读出形状
print(midwest.head())#读出前几行
print(midwest.columns)#读出列名
print(midwest['category'])#读出类别(表单中这一列)
print(np.unique(midwest['category']))#读出类别,并去掉重复项
绘图
多少种类型
categories=np.unique(midwest['category'])
颜色的问题

刚才就是两个颜色,自己还能手动确定个黑色和红色呢,现在类型多导致颜色特别多了,自己手动确定肯定是不现实了,所以就有更高级的方法,用光谱。

colors=[plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]
画布的设置
plt.figure(figsize=(16,10),#尺寸
           dpi=100,#图像分辨率
           facecolor='w',#白色背景
           edgecolor='k'#黑色边缘
           )
循环绘图
for i ,category in enumerate(categories):
    plt.scatter('area','poptotal',#用data中的哪几列
                data=midwest.loc[midwest.category==category,:],#数据是什么
                s=20, c=np.array(colors[i]).reshape(1, -1), label=str(category))
装饰图像

横纵坐标的范围----最小的刻度是多大,最大的刻度是多大

标题的设置,标题字体大小的设置

plt.gca().set(xlim=(0,0.12),ylim=(0,80000))#控制横纵坐标的范围
plt.xticks(fontsize=12)#坐标轴上字体的大小
plt.yticks(fontsize=12)
plt.ylabel('人口',fontsize=22) #坐标轴上的标题和字体大小
plt.xlabel('面积',fontsize=22)
plt.title("美国城市人口和面积情况", fontsize=22) #整个图像的标题和字体的大小
plt.legend(fontsize=12) #图例的字体大小
plt.show()
完整程序
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

mpl.rcParams['font.sans-serif'] = [u'SimHei']#用来显示正常的中文标签
mpl.rcParams['axes.unicode_minus'] = False#用来显示正常的符号

midwest = pd.read_csv(r"./dataSet/midwest_filter.csv")
print(midwest.shape)#读出形状
print(midwest.head())#读出前几行
# print(midwest.columns)#读出列名
# print(midwest['category'])#读出类别(表单中这一列)
# print(np.unique(midwest['category']))#读出类别,并去掉重复项

categories=np.unique(midwest['category'])
colors=[plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]

plt.figure(figsize=(16,10),#尺寸
           dpi=100,#图像分辨率
           facecolor='w',#白色背景
           edgecolor='k'#黑色边缘
           )

for i ,category in enumerate(categories):
    plt.scatter('area','poptotal',#用data中的哪几列
                data=midwest.loc[midwest.category==category,:],#数据是什么
                s=20, c=np.array(colors[i]).reshape(1, -1), label=str(category))

plt.gca().set(xlim=(0,0.12),ylim=(0,80000))#控制横纵坐标的范围
plt.xticks(fontsize=12)#坐标轴上字体的大小
plt.yticks(fontsize=12)
plt.ylabel('人口',fontsize=22) #坐标轴上的标题和字体大小
plt.xlabel('面积',fontsize=22)
plt.title("美国城市人口和面积情况", fontsize=22) #整个图像的标题和字体的大小
plt.legend(fontsize=12) #图例的字体大小
plt.show()

组织分享活动-hebut

三:常用的图形和对应的源码

巨人的肩膀 刚才我那个图其实就是从常用的图中找到的第一个,然后加入了自己的理解给大家讲述的,这个博客里的图很有意义,但是源码也有错误的地方,比如我刚刚给大家展示的图,其实这个大佬就笔误了,缺少了左上方的那个点。

我一般的画图就是显示找到大概类似的图,然后改造他。通常我在找大概类似的图的时候,就会发现原来有更好的可以替代我之前想的。

四:神器的演示

为什么要这个库: 一篇论文投多个期刊,每个期刊对图表格式要求不一,同一组数据要用多种工具分别绘图。

这个库其实是刚刚出来的,还没有完全完善好,但是想法真的非常好,我觉得对于有志于发SCI的牛人来说可以说是如虎添翼。我在这儿可以给大家简单的演示一下demo。

demo的效果很好,在这种不是特别复杂的曲线上效果都还可以。但是在复杂的上面就欠缺了。

安装

pip install SciencePlots

代码

import numpy as np
import matplotlib.pyplot as plt

def model(x, p):
    return x ** (2 * p + 1) / (1 + x ** (2 * p))

x = np.linspace(0.75, 1.25, 201)

with plt.style.context(['science','no-latex']):
    fig, ax = plt.subplots()
    for p in [10, 15, 20, 30, 50, 100]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.set(xlabel='Voltage (mV)')
    ax.set(ylabel='Current ($\mu$A)')
    ax.autoscale(tight=True)
    fig.savefig('figures/fig1.pdf')
    fig.savefig('figures/fig1.jpg', dpi=300)

with plt.style.context(['science', 'ieee','no-latex']):
    fig, ax = plt.subplots()
    for p in [10, 20, 50]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.set(xlabel='Voltage (mV)')
    ax.set(ylabel='Current ($\mu$A)')
    ax.autoscale(tight=True)
    fig.savefig('figures/fig2.pdf')
    fig.savefig('figures/fig2.jpg', dpi=300)

with plt.style.context(['science', 'scatter','no-latex']):
    fig, ax = plt.subplots(figsize=(4,4))
    ax.plot([-2, 2], [-2, 2], 'k--')
    ax.fill_between([-2, 2], [-2.2, 1.8], [-1.8, 2.2], color='dodgerblue', alpha=0.2, lw=0)
    for i in range(7):
        x1 = np.random.normal(0, 0.5, 10)
        y1 = x1 + np.random.normal(0, 0.2, 10)
        ax.plot(x1, y1, label=r"$^\#${}".format(i+1))
    ax.legend(title='Sample', loc=2)
    ax.set_xlabel(r"$\log_{10}\left(\frac{L_\mathrm{IR}}{\mathrm{L}_\odot}\right)$")
    ax.set_ylabel(r"$\log_{10}\left(\frac{L_\mathrm{6.2}}{\mathrm{L}_\odot}\right)$")
    ax.set_xlim([-2, 2])
    ax.set_ylim([-2, 2])
    fig.savefig('figures/fig3.pdf')
    fig.savefig('figures/fig3.jpg', dpi=300)

本文地址:https://blog.csdn.net/xiaodazi0723/article/details/107336064