python全栈-数据可视化
python全栈-数据可视化
文章目录
- Matplotlib
- 实操1 根据三组数据,画到一个条形图里面
- Seaborn
- pyecharts
- 词云图wordcloud
- 雷达图 Rader
- 地图 Map
- 坐标+地图geo
- 组合图 overlap
- 时间坐标图timeline
Matplotlib
方法名 | 说明 |
---|---|
title() | 设置图表的名称 |
xlabel() | 设置x轴名称 |
ylabel() | 设置y轴名称 |
xticks(x,ticks,rotation) | 设置x轴的刻度 rotation旋转角度 |
yticks() | 设置y轴的刻度 |
plot() | 绘制线性图表 |
show() | 显示图表 |
legend() | 显示图例 |
text(x,y,text) | 显示每条数据的值 x,y值的位置 |
figure(name,figsize=(w,h),dpi=n) | 设置图片大小 |
-
直线 plt.plot([0,2],[1,4])
-
折线
-
x=[1,2,3,4,5] squares=[1,4,9,16,25] plt.plot(x,squares)
-
-
标签文字和线条粗细
- plt.plot(datas,squares,linewidth=5) linewidth折线的粗细
- plt.title(‘Numbers’,fontsize=24) fontsize文字字号
-
设置中文标题
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
-
查看matplotlib有哪些风格 print(plt.style.available)
-
设置风格 plt.style.use(‘ggplot’) 必须在绘图之前设置
-
显示图例
- plt.legend(loc=2) loc是图例在图片上的位置,在官网上有对应的数字
- plt.plot(x, max_temperature, label=‘最高温’) label是线在图例的名称
-
双折线
-
使用两次 plt.plot()
-
plt.plot(x, max_temperature, label='最高温') plt.plot(x, min_temperature, label='最低温')
-
-
保存图片 plt.savefig(‘result.jpg’) 需要在plt.plot(x,y)绘图之后
- 如果直接写成 plt.savefig(‘cos’) 会生成cos.png
-
绘制曲线 还是使用plot方法,数据量越大越好
-
在获取数值的时候,使用Numpy模块快速生成
- 生成x的坐标(0到10的100个等差数列的数) x=np.linspace(0,10,100)
- 正弦曲线 sin_y=np.sin(x) plt.plot(x,sin_y)
- 余弦曲线 cos_y=np.cos(x) plt.plot(x,cos_y)
-
画布分区
- subplot分区
- plt.subplot(x,y,n) x行y列,n是选中第一个作为下一次绘制的位置
- 将画布分为2行2列,将图画到画布的1区域
plt.subplot(2,2,1)
简写plt.subplot(221)
- subplots分区
- fig,ax=plt.subplots(nrows=2,ncols=2) 参数是行数和列数
- ax[0][1].plot(x,np.sin(x)) ax是二维数组,指定绘图位置
- fig是把画布的内容保存为图片
- subplot分区
-
散点图
-
plt.scatter(x,y) 传入xy坐标即可
-
import matplotlib.pyplot as plt import numpy as np # 绘制不同大小不同颜色的散点图 np.random.seed(0) x=np.random.rand(100) y=np.random.rand(100) colors=np.random.rand(100) size=np.random.rand(100)*1000 plt.scatter(x,y,c=colors,s=size,alpha=0.7) plt.show()
- plt.scatter(x,y,c=colors,s=size,alpha=0.7)
- c是指定每个点颜色
- s是指定每个点的大小
- alpha是点的透明度,有透明度可以看到相邻两个点的互相遮盖情况 1是不透明
-
plt.plot(x,y,‘o’) 给plot第三个参数赋值字母o,就是散点图
-
-
不同种类不同颜色的线
作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值
- plt.plot(x,x,‘–c’) #虚线 浅蓝色
字符 | 描述 |
---|---|
‘-’ | 实线样式 |
‘–’ | 短横线样式 |
‘-.’ | 点划线样式 |
‘:’ | 虚线样式 |
‘.’ | 点标记 |
‘,’ | 像素标记 |
‘o’ | 圆标记 |
‘v’ | 倒三角标记 |
‘^’ | 正三角标记 |
‘1’ | 下箭头标记 |
‘2’ | 上箭头标记 |
‘3’ | 左箭头标记 |
‘4’ | 右箭头标记 |
‘s’ | 正方形标记 |
‘p’ | 五边形标记 |
‘*’ | 星形标记 |
‘h’ | 六边形标记 1 |
‘H’ | 六边形标记 2 |
‘+’ | 加号标记 |
‘x’ | X 标记 |
‘D’ | 菱形标记 |
‘d’ | 窄菱形标记 |
‘_’ | 水平线标记 |
- 颜色的缩写
字符 | 颜色 |
---|---|
‘b’ | 蓝色 |
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 青色 |
‘m’ | 品红色 |
‘k’ | 黑色 |
‘w’ | 白色 |
-
条形图
- bar(x,y,color,width) 函数来生成纵向条形图
- barh(x,y,color,height) 函数来生成条形图
- bar函数的宽度并不是像素宽度。bar函数会根据二维坐标系的尺寸,以及x坐标值的多少,自动确定每一个柱的宽度,而width指定的宽度就是这个标准柱宽度的倍数。该参数值可以是浮点数,如0.5,表示柱的宽度是标准宽度的0.5倍。
- color参数可以省略
-
对部分条形图,使用颜色区分
-
v_bar=plt.bar(x,y,color=‘lightblue’) plt.bar会返回每一个柱的值
-
for bar,height in zip(v_bar,y):if height<0:bar.set(color='lightgreen',linewidth='3')
-
使用zip遍历 柱和高度y,并使用y作为判断依据,给柱设置颜色bar.set()
-
-
带方差的条形图 就是顶部中间有一个直线,代表方差/波动
ax.bar(x,y,yerr=variance,alpha=0.3)
yerr代表上下浮动值ylim
方法用于设置y轴的显示范围,控制图表中y轴的最小值和最大值。
-
fill_between的使用
-
x=np.linspace(0,10,200) y1=2*x+1 y2=3*x+1.5 fig,ax=plt.subplots() ax.fill_between(x,y1,y2,color='red')
-
就是在两个y值之间填补颜色
-
实操1 根据三组数据,画到一个条形图里面
import matplotlib.pyplot as pltreal_names=['电影1','电影2','电影3']
real_num1=[5453,7548,6543]
real_num2=[1840,4013,3421]
real_num3=[1080,1673,2342]width=0.3
x=range(len(real_names))x_label = [f'星期{i+1}' for i in x]plt.rcParams['font.sans-serif']=['SimHei']
plt.xticks([i+width for i in x],x_label)
plt.title('3天的票房数')
plt.bar(x,real_num1,color='g',width=width,label='电影一')
plt.bar([i+width for i in x],real_num2,color='b',width=width,label='电影二')
plt.bar([i+(2*width) for i in x],real_num3,color='r',width=width,label='电影三')
plt.legend(loc=1)
plt.show()
- 在条形图的每一个柱上面显示具体数据
- 使用plt.text方法,提供x和y坐标,然后给一个要填写的内容
x=range(1,4)
y = [2,3,4]
plt.bar(x,y)
for a,b in zip(x,y):plt.text(a,b,b)
改良版的实操1
import matplotlib.pyplot as pltreal_names=['电影1','电影2','电影3'] real_num1=[5453,7548,6543] real_num2=[1840,4013,3421] real_num3=[1080,1673,2342] width=0.3 x=range(len(real_names))x_label = [f'星期{i+1}' for i in x]plt.rcParams['font.sans-serif']=['SimHei'] plt.xticks([i+width for i in x],x_label) plt.title('3天的票房数') plt.bar(x,real_num1,color='g',width=width,label='电影一') plt.bar([i+width for i in x],real_num2,color='b',width=width,label='电影二') plt.bar([i+(2*width) for i in x],real_num3,color='r',width=width,label='电影三') plt.legend(loc=1) # 给条形图加具体数值 for i,j in enumerate(real_num1):plt.text(x[i]-0.1,real_num1[i]*1.01,j) # 注意计算的坐标 for i,j in enumerate(real_num2):plt.text([i+width for i in x][i]-0.1,real_num2[i]*1.01,j) for i,j in enumerate(real_num3):plt.text([i+(2*width) for i in x][i]-0.1,real_num3[i]*1.01,j) plt.show()
enumerate方法是给两个返回值,第一个是序号,第二个是具体内容
-
饼图 pie()
-
参数
-
paches,texts,autotexts=plt.pie([a,b],labels=labels,colors=colors,explode=(0,0.05),autopct='%0.1f%%')
- autopct='%0.1f%%'控制精度
- labels 传入饼图每一块的名称
- colors 指定每一块的颜色
- explode=分裂距离 相邻两块之间的间隙
-
返回值
-
paches
-
texts 遍历这个变量修改的是标签,是饼图外面对应每一块的那个字体的属性 和autotexts 一样
-
autotexts 遍历这个变量,然后使用set_color方法设置字体颜色,set_fontsize设置字体大小
-
#设置饼状图中的字体颜色 for text in autotexts:text.set_color('white')text.set_fontsize(20)
-
-
-
-
直方图 hist(data,bins,normed)
- data 所有的数据
- bins 分几组
- normed y轴是否显示成百分比
- 就是把所有的数据data直接给hist方法,然后使用bins指定分成几组,比如100个随机数,分成10组,就是bins=10.
Seaborn
是matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易。
应该把 Seaborn 视为 matplotlib 的补充,而不是替代物
- 直线
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
plt.plot([1,5,10],[1,3,5])
plt.show()
-
Seaborn 支持的风格有5种:
- darkgrid 黑背景-白格
- whitegrid 白背景-白格
- dark 黑背景
- white 白背景
- ticks
-
设置风格的方法:
- set(style=‘’) sns.set(style=‘dark’)
- set_style(value) 统一设置 sns.set_style(‘ticks’)
- axes_style(value) 单一设置 with sns.axes_style(‘darkgrid’):
-
移除轴脊柱
- 就是绘图的时候,那个框架,最外边那个框,可以移除
- matplotlib 参数是做不到这一点的,但是你可以使用 seaborn 的despine() 方法来移除它们
- 移除轴脊柱要在 填充数据之后,在显示图表之前
-
图像风格 set_context()
- 标签的大小,线条和绘图的其他元素,但不会影响整体样式
- 四个预设是 paper ,notebook ,talk ,poster 。该 notebook 样式是默认的
- sns.set_context(‘notebook’)
- sns.set_context(rc={“lines.linewidth”:5}) 线条粗细
- sns.set_context(rc={“xtick.labelsize”:20}) x 轴刻度字号
-
直方图 distplot
- sns.distplot(x,bins=20, kde=False) bins是分几组,kde是数据分布曲线,默认是False
-
条形图 barplot
-
加载数据 就是读文件
titanic = sns.load_dataset('titanic')
- 读的是csv文件,不用写后缀
- 读完文件之后可以直接绘图,可以自动识别x轴标签,坐标等等各种数据都可以
- sns.barplot(x=‘sex’, y=‘survived’,data=titanic, hue=‘class’) 绘制条形图
-
盒图 boxplot
- 盒图也叫盒须图或者箱图。用于表示分布状态
- sns.boxplot(x=‘day’, y=‘total_bill’,data=tips, hue=‘time’)
-
小提琴图 是箱图和密度图的一种结合图形
- sns.violinplot(x=‘day’, y=‘total_bill’,data=tips, hue=‘sex’)
-
分布散点图 stripplot
- sns.stripplot(x=‘day’, y=‘total_bill’,data=tips, jitter=True)
- jitter默认也是True,会把点集中到一条线上
-
分簇散点图 swarmplot
- sns.swarmplot(x=‘day’, y=‘total_bill’,data=tips,hue=‘sex’) 可以使用hue分组
- color=‘k’ 可以指定颜色
- alpha=1.0 透明度也可以使用
-
散点图 scatterplot
- sns.scatterplot(y=‘tip’,x=‘total_bill’,data=tips)
-
双轴密度图 kdeplot
- sns.kdeplot(x=‘x’,y=‘y’,data=df)
- 参数shade=True 可以上色,不上色就是等高线的效果,只有线
-
联合图 jointplot 就是两种图的结合版,看起来很牛逼
- sns.jointplot(x=‘x’, y=‘y’,data=df)
-
点图 pointplot 和折线图类似,花里胡哨的
- sns.pointplot(x=‘sex’, y=‘survived’,data=titanic, hue=‘class’)
-
热力图 heatmap
-
热力图(heatmap)是以矩阵的形式表示
-
数据值在图形中以颜色的深浅来表示数量的多少
-
并可以快速到到大值的与最小值所在位置。
-
在机器学习的分类中经常用来作混淆矩阵的比较。
-
sns.heatmap(uniform_data)
-
设置参数vmin vmax的值,这样大于vmax值得就变成同一个颜色,就是这两个参数之间的数据会有色差表示。超过两端的数据用统一颜色表示
-
参数 annot=True 在图上写上值,但是看不清
- 再加上fmt=d 以整数的形式写上去
-
linewidths=0.5 将每个格子之间留有缝隙
-
cbar=False 将右边的图例去掉
-
修改色系cmap=‘YIGnBu’ 就是颜色类型
-
-
散布图矩阵 pairplot
- 会同时绘制数据中所有特征两两之间的关系图。
- 对角线是直方图,其余地方是散点图
- 参数
- kind参数设置对角线之外的图形 hist kde rge
- kde把散点图变成双轴密度图,就是那个有颜色的等高线图
- hist是一种散点图,但是以像素的形式表示,就跟我的世界画风一样
- rge 就是在散点图的基础上加了一条直接,就是数据模拟的那个直线
- kind参数设置对角线之外的图形 hist kde rge
-
线型图 lineplot
- 就是把变化大的地方取平均值,连成一条线。为了看出变化的范围有浅浅的背景进行表示
-
回归分析图 就是根据散点图找到回归线
- 线性回归图通过大量数据找到模型拟合线性回归线。就是高中做题的时候,经常画的线,根据点图画线。
- sns.lmplot() 功能多,规范多
- sns.regplot() 推荐,支持的参数与数据类型比较多一些
- 这俩方法都可以绘制同样效果的图
-
网格图
-
catplot() 分类图,可通过指定kind参数来绘制其它图形,如散点图,箱图、小提琴图等
- 就是之前绘图有分组,但是在同一个图上展示,现在可以把每一组独立成另一张图
- sns.catplot(x=‘total_bill’,y=‘tip’,data=tips,hue=‘time’,col=‘sex’) 意思是以列的形式,按性别分组,还可以使用row参数再次分组
-
FacetGrid()
- 常用参数:
- height 高
- aspect 宽
- palette 色板,就是点的颜色,按照分类上色
- col 分图属性(列)
- row 分图属性(行)
- hue 属性分类
- margin_titles
- size 图的大小,已被height 替代
- row_order 显示分图的数据
- hue_kws 显示图标记的形状(散点) 三角啊啥的
- s 点的大小
- linewidth 点的边框粗细
- wspace hspace 相邻两图之间的距离
-
pyecharts
有良好的交互性 最受欢迎
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeTypebar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 修改主题.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]) # x轴数据.add_yaxis("商家 A", [5, 20, 36, 10, 75, 90]) # y轴数据.set_global_opts(title_opts=opts.TitleOpts(title='标题')) # 标题
)
bar.render()
使用 options 配置项,在 pyecharts 中,一切皆 Options。
导入pyecharts里面的faker模块,可以自动生成数据方便对图表进行练习
- TitleOpts:标题配置项
- AxisOpts:坐标轴配置项
- AxisLineOpts: 坐标轴轴线配置项
- AxisTickOpts: 坐标轴刻度配置项
- AxisPointerOpts: 坐标轴指示器配置项
- InitOpts:初始化配置项
- AnimationOpts:Echarts 画图动画配置项
- TooltipOpts:提示框配置项
- ItemStyleOpts:图元样式配置项
- LabelOpts:标签配置项
词云图wordcloud
使用add方法添加数据,数据的格式是序列(字符串+权重),需要有多个这样的序列
参数shape设置词云图的轮廓
def add(# 系列名称,用于 tooltip 的显示,legend 的图例筛选。series_name: str,# 系列数据项,[(word1, count1), (word2, count2)]data_pair: Sequence, # 词 云 图 轮 廓 , 有 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' 可选shape: str = "circle", # 自定义的图片(目前支持 jpg, jpeg, png, ico 的格式,其他的图片格式待测试)# 该参数支持:# 1、 base64 (需要补充 data 头);# 2、本地文件路径(相对或者绝对路径都可以)# 注:如果使用了 mask_image 之后第一次渲染会出现空白的情况,再刷新一次就可以了(Echarts 的问题)# Echarts Issue: https://github.com/ecomfe/echarts-wordcloud/issues/74mask_image: types.Optional[str] = None, # 单词间隔word_gap: Numeric = 20, # 单词字体大小范围word_size_range=None,# 旋转单词角度rotate_step: Numeric = 45, # 距离左侧的距离pos_left: types.Optional[str] = None, # 距离顶部的距离pos_top: types.Optional[str] = None, # 距离右侧的距离pos_right: types.Optional[str] = None, # 距离底部的距离pos_bottom: types.Optional[str] = None, # 词云图的宽度width: types.Optional[str] = None, # 词云图的高度height: types.Optional[str] = None, # 允许词云图的数据展示在画布范围之外is_draw_out_of_bound: bool = False, # 提示框组件配置项,参考 `series_options.TooltipOpts` tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, # 词云图文字的配置textstyle_opts: types.TextStyle = None, # 词云图文字阴影的范围emphasis_shadow_blur: types.Optional[types.Numeric] = None, # 词云图文字阴影的颜色emphasis_shadow_color: types.Optional[str] = None,
)
雷达图 Rader
就是那种所谓的五边形战士,六边形战士那种效果图
首先是设置每一个角的名称和最大值,然后导入数据,给一个列表,对应每一条边的值
地图 Map
默认是中国地图,以省为界限划分板块,导入数据的方式就是[省名,数值]的方式
还可以以市为界限划分,由于默认显示名称,市的界限太小,字就很密集,可以设置参数只有鼠标移上去的时候,才显示名称
也可以修改参数,切换到某一个省,以市为界限划分,以市名和数值填充
坐标+地图geo
就是动态的地图,给地图上加上点,也就是坐标,这个点可以设置成动态效果
还可以模拟飞行路线,输出出发地和目的地,就能生成一个向量的轨迹图,修改参数使线弯曲,再加上别的图片,就是动态轨迹图了
组合图 overlap
直接绘制两个图,然后‘bar.overlap(line)’ 使用overlap这个方法,就可以把两个图合并显示在一个图上
时间坐标图timeline
就是那种汇报图,一年一个图,有很多年的时候,可以合并显示,下面一个时间坐标轴,点击哪一年就显示哪一年,也可以循环播放,自动切换等等
创建一个timeline对象之后,再创建其他图,折线图等等,然后添加到timeline对象,就可以实现了