组织分享活动-hebut
一:开篇介绍
林老师好,曹老师好,王老师好,各位同学好。
我是林涛老师课题组的学生,我今天分享的是利用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() #让图形显示
如何画出两拨点点
首先两拨点点需要包含几个元素? 应该是三个元素,分别横坐标,纵坐标,属于哪一波。
和刚才一样还是需要先把这三个元素造出来,和刚才比较多了一个每个元素所属类型的信息。
- 构造出比上次多的那个信息
- 分批画图,有几种类型就画几次,(为什么这么做,因为画点用的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() #让图形显示
画出美国各个城市的人口数量图
画图之前我首先说明数据集,包括数据集的大小和数据集所包含的信息
这个数据集有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()
三:常用的图形和对应的源码
巨人的肩膀 刚才我那个图其实就是从常用的图中找到的第一个,然后加入了自己的理解给大家讲述的,这个博客里的图很有意义,但是源码也有错误的地方,比如我刚刚给大家展示的图,其实这个大佬就笔误了,缺少了左上方的那个点。
我一般的画图就是显示找到大概类似的图,然后改造他。通常我在找大概类似的图的时候,就会发现原来有更好的可以替代我之前想的。
四:神器的演示
为什么要这个库: 一篇论文投多个期刊,每个期刊对图表格式要求不一,同一组数据要用多种工具分别绘图。
这个库其实是刚刚出来的,还没有完全完善好,但是想法真的非常好,我觉得对于有志于发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