大家好,小编来为大家解答以下问题,python数据可视化的工具库有哪些,Python数据可视化工具matplotlib,现在让我们一起来看看吧!
数据可视化可以使用d3js和echarts,doris
plotly和pyecharts
在python可以使用seaborn,matplotlib,plotnine可视化包
R语言的ggplot2包
目录
什么是数据可视化
python三大数据可视化工具库的简介:Matplotlib、Seaborn和Plotnine
Matplotlib绘图基础
Plotnine绘图基础
基本图表的Quick Start
Plotnine和Matplotlib进阶画图
如何选择合适的图表正确表达数据
数据可视化案例:使用Plotnine绘制元素周期表
plotnine
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei','Songti SC','STFangsong']
plt.rcParams['axes.unicode_minus']=False
#用来正常显示负号
import seaborn as sns
df=pd.DataFrame({'variable':['gender','gender','age','age','income','income','income','income'],
'catogory':['Female','Male','1-24','25-24','55+','Lo','Lo-Med','Med','High'],
'value':[60,40,50,30,20,10,25,25,40],})
df['variable']=pd.Categorical(df['variable'],categories=['gender','age','income'])
df['category']=pd.Categorial(df['category'],categories=df['category'])
#堆叠柱状图
from plotnine import *
(
ggplot(df,aes(x='variable',y='value',fill='category'))+geom_col()
)
# 柱状图
from plotnine import *
(
ggplot(df,aes(x='variable',y='value',fill='category'))+gem_col(stat='identity',position='dodge')
)
matplotlib
创建一个图形对象,并设置图形对象的大小(可以想象成在白纸中添加一个图,并设置图的大小):plt.figure(figsize=(6,4))
在纸上的坐标系中绘制散点:plt.scatter(x=x, y=y)
设置x轴的标签label:plt.xlabel(‘x’)
设置y轴标签的label:plt.ylabel(‘y’)
设置图表的标题:plt.title(‘y = sin(x)’)
展示图标:plt.show()
plt.legend()
x=np.linspace(-2*np.pi,2*np.pi,100)
y=np.sin(x)
array = numpy.linspace(start, end, num=num_points)
#将在start和end之间生成一个统一的序列,共有num_points个元素。
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(x=x, y=y)
plt.xlabel(‘x’)
plt.ylabel(‘y’)
plt.title(‘y = sin(x)’)
plt.show()
【例子】绘制y = sin(x) 和 y=cos(x)的散点图:
- 创建第一个绘图对象
- 在纸上的坐标系中绘制散点:plt.scatter(x=x, y=sin(x))
- 设置x轴的标签label:plt.xlabel(‘x’)
- 设置y轴标签的label:plt.ylabel(‘y’)
- 设置图表的标题:plt.title(‘y = sin(x)’)
- 创建第二个绘图对象:
- 在纸上的坐标系中绘制散点:plt.scatter(x=x, y=cos(x))
- 设置x轴的标签label:plt.xlabel(‘x’)
- 设置y轴标签的label:plt.ylabel(‘y’)
- 设置图表的标题:plt.title(‘y = cos(x)’)
x=np.linspace()-2*np.pi,2+np.pi,100)
y1=np.sin(x)
y2=np.cos(x)
#绘制第一个图
fig1=plt.figure(figsize=
(6,4),num='first')
fig1.suptitle('y=sin(x)')
plt.scatter(x=x,y=y1)
plt.xlabel('x')
plt.ylabel('y')
#绘制第二个图
fig2=plt.figure(figsize=(6,4),num='second')
fig2.suptitle('y=cos(x)')
plt.scatter(x=x,y=y2)
plt.xlabel('x')
plt.ylabel('y')
seaborn
x=np.linspace(-10,10,100)
y=2*x+1+np.random.randn(100)
df=pd.DataFrame({'x':x,'y':y})
#使用matplotlib绘制带有拟合直线效果的散点图
func=np.polyfit(x,y,1)#拟合直线
poly=np.poly1d(func)#设置拟合直线
y_pred=poly(x)#预测
plt.scatter(x,y)#绘制点图
plt.plot(x.y_pred)#绘制拟合直线图
plt.xlabel('x')
plt.ylabel('y')
plt.show()
#使用seaborn绘制带有拟合直线效果的散点图
sns.lmplot("x","y",data=df)
plotnine
from plotnine improt *
from plotnine.data import *
mpg.head()
mpg数据集记录了美国1999年和2008年部分汽车的制造厂商,型号,类别,驱动程序和耗油量python turtle画简单树。
- manufacturer 生产厂家
- model 型号类型
- year 生产年份
- cty 和 hwy分别记录城市和高速公路驾驶耗油量
- cyl 气缸数
- displ 表示发动机排量
- drv 表示驱动系统:前轮驱动、(f),后轮驱动®和四轮驱动(4)
- class 表示车辆类型,如双座汽车,suv,小型汽车
- fl (fuel type),燃料类型
# 绘制汽车在不同驱动系统下,发动机排量与耗油量的关系
p1=(
ggplot(mpg,aes(x=''displ),y='hwy',color='drv'))+geom_point()#绘制散点图图层
+geom_smooth(method='lm')#绘制平滑线图层
+labs(x='displacement',y='horsepower') # 绘制x、y标签图层
)
print(p1)
Plotnine没有实现除了直角坐标以外的坐标体系
Matplotlib具有ggplot风格,可以通过设置ggplot风格绘制具有ggplot风格的图表。plt.style.use("ggplot") #风格使用ggplot
matplotlib绘图基础
Matplotlib 图表的组成元素包括: 图形 (figure)、坐标图形 (axes)、图名 (title)、图例 (legend)、 主要刻度 (major tick)、次要刻度 (minor tick)、主要刻度标签(major tick label)、次要刻度标签 (minor tick label)、 Y轴名 (Y axis label)、X轴名 ( X axis label)、边框图 (line)、数据标记 (markers)、网格 (grid) 线等
Mayplotlib绘图元素包括:基本绘图类型与容器绘图类型
(1)基本绘图类型(graphic primitives):点 (marker)、线 (line)、文本 (text)、图例 (legend)、网格线 (grid)、 标题 (title)、图片 (image) 等;
(2)容器绘图类型(containers):
Figure:最重要的元素,代表整个图像,所有的其他元素都是绘制在其上(如果有多个子图,子图也绘制在figure上)。Figure 对象包含一些特殊的 artist 对象,如图名 (title)、图例 (legend)。
Axes:第二重要的元素,代表 subplot(子图),数据都是显示在这个区域。一个Figure至少含有一个Axes对象,当绘制多个子图时
Axis:代表坐标轴对象,本质是一种带装饰的 spines,一般分为 xaxis 和 yaxis,Axis对象主要用于控制数据轴上的刻度位置和显示数值。
Spines:表示数据显示区域的边界,可以显示或不显示。
Artist:表示任何显示在 Figure 上的元素,Artist 是很通用的概念,几乎任何需要绘制的元素都可以当成是 Artist,但是一个 Artist 只能存在于一个 Axes 之上。
plt.figure(figsize=(6,3), dpi=75)#设置图表的大小figsize与分辨率dpi
plt.title('这是一个标题')
plt.xlabel("这是x轴标签")/plt.ylabel("这是y轴标签")
plt.axis(xmin=0, xmax=1, ymin=0.5)#设置x轴和y轴的显示范围 |plt.xlim(0,1)/plt.ylim(0,1)
plt.xticks(labels=['A', 'B', 'C', 'D'])/plt.yticks(list(np.arange(11))#设置x轴和y轴的刻度数值
grid()#设置网格线
plt.grid(b=True, which='both', axis='y')
# b: 是否显示网格线 True/None;
# which: 网格线显示的尺度。字符串,可选参数,取值范围为{'major', 'minor', 'both'},
#默认为'both'。'major'为主刻度、'minor'为次刻度。
# axis: 选择网格线显示的轴。字符串,可选参数,取值范围为{'both', 'x', 'y'},默认为'both'`。
# | | legend() | 设置图表的图例 | plt.legend("这是一个图例", loc='best')
# loc表示图例的位置,可选:0-'best', 1-'upper right',2-'upper left',3-'lower left',4-'lower right',5-'right',6-'center left',7-'center right',
# 8-'lower center',9-'upper center',10-'center' |
创建一个figure,figure的大小figsize为(12,10);
在figure中创建两个Axes子图;
在每个Axes子图中分别绘制y=sin(x)和y=cos(x)图像,并添加title、xlabel、ylabel、axis、grid、和legend
x=np.linspace(-2*np.pi,2*np.pi,100)
y1=np.sin(x)
y2=np.cos(x)
#开始绘图
fig=plt.figure(figsize=(16,6))
ax1=fig.add_axes([0.1,0.1,0.4,0.8])
plt.scatter(x=x, y=y1, label=r"$y=sin(x)$") # 在axes1中绘制y=sin(x)散点图, label是为了legend能够知道是哪个绘图的图例
plt.title("y = sin(x)") # 在axes1设置标题
plt.xlabel("x") # 在axes1中设置x标签
plt.ylabel("y") # 在axes1中设置y标签
plt.axis(xmin=-2*np.pi, xmax=2*np.pi, ymin=-1, ymax=1) # 在axes1中设置x轴和y轴显示范围
plt.xticks(
ticks=[-2*np.pi, -3/2*np.pi, -np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi, 3/2*np.pi, 2*np.pi],
labels=[r'$-2 \pi$', r'$-\frac{3 \pi}{2}$', r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3 \pi}{2}$', r'$2\pi$']
) # 在axes1中设置x轴刻度的值,ticks代表在哪个位置修改,labels代表修改的具体值是多少
plt.grid(b=True, which='both') # 在axes1中设置设置网格线
plt.legend(loc=1)
ax2 = fig.add_axes([0.6,0.1,0.4,0.8]) # [left, bottom, width, height], 它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度
plt.scatter(x=x, y=y2, label=r"$y=cos(x)$") # 在axes2中绘制y=cos(x)散点图,label是为了legend能够知道是哪个绘图的图例
plt.title("y = cos(x)") # 在axes2设置标题
plt.xlabel("x") # 在axes2中设置x轴标签
plt.ylabel("y") # 在axes2中设置y标签
plt.axis(xmin=-2*np.pi, xmax=2*np.pi, ymin=-1, ymax=1) # 在axes2中设置x轴和y轴显示范围
plt.xticks(
ticks=[-2*np.pi, -3/2*np.pi, -np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi, 3/2*np.pi, 2*np.pi],
labels=[r'$-2 \pi$', r'$-\frac{3 \pi}{2}$', r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3 \pi}{2}$', r'$2\pi$']
) # 在axes2中设置x轴刻度的值,ticks代表在哪个位置修改,labels代表修改的具体值是多少
plt.grid(b=True, which='both') # 在axes2中设置设置网格线
plt.legend(loc=1) # 在axes2中设置图例
plt.show()
4.Plotnine绘图基础
Plotnine中的图层可以分为:必备图层和可选图层
(1)必备图层:ggplot()图层与geom_xxx()/stat_xxx()图层
-
ggplot()图层 底层绘图函数
ggplot(data, aes(x=‘col_x’, y=‘y_value’, fill=‘col_class’))
设置变量的映射aes(),用来表示x和y,还可以在aes()内控制颜色color、大小size和形状shape -
geom_xxx()图层:几何对象
散点图geom_point()、柱状图geom_bar()、折线图geom_line()、直方图geom_histogram() -
stat_xxx()图层。根据图层函数输入的变量个数和输入变量的数据类型(涉及复杂的统计变换)
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.sin(x)
y_label = np.random.choice(['1','2','3'], 100)
data = pd.DataFrame({'x':x, 'y':y, 'label':y_label})
# 绘制散点图geom_point()
p1 = (
ggplot(data, aes(x='x', y='y', fill='y_label', size='y', shape='y_label'))+
geom_point()
)
print(p1)
(2)可选图层
scale_xxx()、facet_xxx()、guides_xxx()、coord_xxx()以及theme()
- scale_xxx()图层:标度(scale)是用于调整数据映射的图形属性,scale_xxx()获取数据并对其进行调整以适应视觉的不同方面,即长度、颜色、大小和形状等
scale_xxx()的基本格式为:scale_映射类型_数据类型()。其中,映射类型包括:xy轴,size, color(颜色), fill(填充颜色), shape, alpha(透明度), linetype;数据类型包括:连续型continuous,离散型discrete,自定义manual,同一型identity。
p1=(
ggplot(mpg,aes(x='displ', y='hwy', color='drv', shape='drv'))
+ geom_point() # 绘制散点图图层
+ labs(x='displacement', y='horsepower') # 绘制x、y标签图层
+ scale_shape_manual(values=('o', 's', '*')) # 添加shape映射美化
)
直角坐标系的类型,分面图层
p1=(ggplot(mpg,aes(x='displ', y='hwy', color='drv') +geom_point()
+ labs(x='displacement', y='horsepower') # 绘制x、y标签图层
+ facet_grid('.~ class', labeller='label_value') # 按照车辆类型分面))
数据可视化的图表分为以下类别:
- 类别型图表
- 关系型图表
- 数据分布型图表
- 时间序列型图表
- 空间分布型图表
(1)类别型图表:
类别型图表一般表现为:X类别下Y数值之间的比较,因此类别型图表往往包括:X为类别型数据、Y为数值型数据。类别型图表常常有:柱状图、横向柱状图(条形图)、堆叠柱状图、极坐标的柱状图、词云、雷达图、桑基图等等。
(2)关系型图表:
关系型图表一般表现为:X数值与Y数值之间的关系,如:是否是线性关系、是否有正向相关关系等等。一般来说,关系可以分为:数值型关系、层次型关系和网络型关系。
- 数值型关系:主要展示两个变量或者多个变量之间的数值关系,如:最简单的散点图、气泡图、相关系数矩阵图、等高线图、曲面图等等。
- 层次型关系:主要展示数据个体(样本)之间的层次关系,有从属关系和包含关系两种。从属关系顾名思义如:不同职位之间的上下属关系,如最简单的树状图;包含关系如:欧洲不同的足球联赛的队伍包含关系,不同洲的国家包含关系等等,如:韦恩图、弧长链接图、圆填充图、旭日图等等。
- 网络型关系:常常值个体之间有联系,但并不是相互包含或者从属关系,如:微信中的朋友的关系网络。网络型关系的图表一般有:和弦图、桑基图、网络图等等。
(3)数据分布型图表:
分布这个词在概率论和数理统计中出现,分布常常指数据以及出现的频率,常见的图表有:频次直方图、频率直方图、核密度图、箱线图、提琴图等等。
(4)时间序列型图表:
时间序列型图表主要描述了数据沿着之间变化而变化的规律,一般来说横轴是时间,纵轴是数值或者类别型数据。常见的图表有折线图、日历图、甘特图等等。
(5)空间分布型图表:
空间分布顾名思义,主要描述了某个数值型/类别型数据随着空间位置变化的规律,如:地图散点图、地图气泡图、地图热力图等等。
下面,我们来详细学习每一种图表的绘制过程:
使用np.polyfit和np.poly1d进行拟合
x = np![在这里插入图片描述](https://img-blog.csdnimg.cn/6c1b90ee2c574a6fa2fc65d5e89c330f.png)
.array([4, 8, 10, 12, 25, 32, 43, 58, 63, 69, 79])
y = np.array([20, 33, 50, 56, 42, 31, 33, 46, 65, 75, 78])
figure1 = plt.figure(figsize=(8, 6))
# coeff 为系数,poly_fit 拟合函数
# 1. 先拟合获取系数
coeff_1 = np.polyfit(x, y, 1)#在这里修改你和的阶数
print("一阶拟合系数为:", coeff_1)
# 2. 根据系数得到多项式
poly_fit_1 = np.poly1d(coeff_1)
print("一阶多项式为:", poly_fit_1)
# 3. 输入变量(单个值或者变量数组),得到拟合结果(数组)
y_fit_1 = poly_fit_1(x)
print("拟合得到的数据为L", y_fit_1)
# 4. 根据结果作图
plt.plot(x, y_fit_1, 'green',label="一阶拟合")
# 5. 根据原始数据以及拟合数据得到拟合优度
rr1 = goodness_of_fit(y_fit_1, y)
print("拟合优度为%.5f" % rr1)
np.ployfit使用最小二乘法进行多项式拟合
numpy.polyfit(x,y,deg,rcond = None,full = False,w = None,cov = False )
参数:
x: 类数组,形状(M,),表示M个采样点的x坐标
y: 类似array_,形状为(M,)或(M,K), 表示采样点的y坐标。通过传递每列包含一个数据集的2D数组,可以一次拟合多个共享相同x坐标的采样点数据集
deg: 度:整数, 表示拟合多项式的度
cov: cov:布尔值,可选。返回估算值和估算值的协方差矩阵。如果full为True,则不返回cov
np.poly1d
如果f(x) = 2x2 +x +1
a= np.array([2,1,1])
p = np.poly1d(a)
numpy.poly1d(c_or_r,r = False,变量= None )
参数:
c_or_r: 数组array,代表多项式的系数,以幂次递减,或者如果第二个参数的值为True,则为多项式的根(多项式求值为0的值)。
r bool(可选): 如果为True,则c_or_r指定多项式的根。默认值为False。
可变str(可选): 将打印p时使用的变量从x更改为variable 。
返回值: 相应的多项式
多项式对象的deriv( )和integ( )方法分别用于计算多项式函数的微分和积分p.deriv()
#微分p.integ()
#积分
多项式函数的根可以用roots( )计算:np.roots(p)
除了使用多项式对象外,还可以直接使用Numpy提供的多项式函数对多项式系数的数组进行运算,主要函数包括:np.poly, np.polyadd, np.polydiv, np.polyint, np.polysub, np.poly1d, np.polyder, np.polyfit, np.polymul, np.polyval等。
1、np.poly1d()此函数有两个参数:
参数1:为一个数组,若没有参数2,则生成一个多项式,例如:
p = np.poly1d([2,3,5,7])
print§ ==>>2x3 + 3x2 + 5x + 7 数组中的数值为coefficient(系数),从后往前 0,1,2.。。为位置书的次数
参数2:若参数2为True,则表示把数组中的值作为根,然后反推多项式,例如:
q = np.poly1d([2,3,5],True)
print(q) ===>>(x - 2)(x - 3)(x - 5) = x3 - 10x2 + 31x -30
参数3:variable=‘z’表示改变未知数的字母,例如:
q = np.poly1d([2,3,5],True,varibale = ‘z’)
print(q) ===>>(z - 2)(z - 3)(z - 5) = z3 - 10z2 + 31z -30
2、多项式poly1d()的方法
a. p(0.5)表示当x = 0.5时,多项式的值为多少
b. p.r表示当多项式为 0 时,此等式的根
c. p.c表示生成多项式的系数数组
d. p.order表示返回最高项的次方数
e. p[1]表示返回第一项的系数
f. 多项式支持实数的四则运算
3、 其他函数
a. deriv([m])表示求导,参数m表示求几次导数
b. integ([m,k])表示积分,参数m表示积几次分,k表示积分后的常数项的值
sns线性关系的展示
seaborn主要通过两个函数来展示通过回归得到的线性关系,regplot()和lmplot()。
sns.regplot(x='tital_bill',y='tip',data=tips)
sns.lmplot(x="total_bill", y="tip", data=tips);
他们之间最主要的区别在于
regplot()中的x, y参数接受多种数据类型,包括numpy数组、pandas序列(Series),或者将pandas DataFrame传递给data参数。
lmplot()的data参数是不能为空的,同时x和y参数必须以字符串形式指定
部分引用:
https://www.jianshu.com/p/f83d61952983