化身天使的博客

python学习笔记第8章:数据可视化(matplotlib,pyecharts)

1.1.1 模板

import pandas as pd

import matplotlib.pyplot as plt

import matplotlib;matplotlib.use('TkAgg')   #图形界面

 

#0.数据定义

plt.rcParams['font.sans-serif']='SimHei'      #解决中文乱码

plt.rcParams['axes.unicode_minus'] = False  #解决负号无法显示

%matplotlib  inline                   #图表直接展示在Jupyter Notebook

%config InlineBackend.figure_format=’svg’  #矢量图格式

 

src = r'C:\Users\用户名\Documents\tmp\read.csv'

df = pd.read_csv(src,encoding='gbk')

 

#2.执行

plt.subplot(1,2,1)            #创建1行两列共两个图,选取第一个

plt.bar(df['项目'],df['金额'])     #绘制条形图,数据分别x轴,y轴

plt.title('上年开销',loc='right')  #设置标题并靠右,缺省center

plt.xlabel('《项目》')              #设置X轴名称

plt.ylabel('金额')                  #设置Y轴名称

for a,b in zip(df['项目'],df['金额']):     #把数值展现到图上

    plt.text(a,b,b,ha='center',va= 'bottom',fontsize=11)

 

plt.subplot(1,2,2)            #1行两列共两个图,选取第二个

plt.pie(df['金额'],labels=df['项目'],autopct='%.0f%%')

     #绘制饼图,先数字,后文本,以百分比显示在图上,不加的话图上是空白

plt.show()      #展示出来

1.1.2 建立画布

 

#add_subplot方式需要,其他不用,如果设置画布大小,可能会用到

import pandas as pd

import matplotlib.pyplot as plt

import matplotlib;matplotlib.use('TkAgg')   #图形界面

 

plt.rcParams['font.sans-serif']='SimHei'      #中文字体使用SimHei

plt.rcParams['axes.unicode_minus'] = False  #解决负号无法显示

%matplotlib  inline                   #图表直接展示在Jupyter Notebook

%config InlineBackend.figure_format=’svg’  #矢量图格式

#plt.rcParams.keys()                   #查看可用设置(字体等很多

#plt.style.available                   #查看可用样式

#plt.style.use(样式名)                 #使用某个样式

fig = plt.figure()                 #建立画布

fig = plt.figure(figsize=(8,8))      #建立画布并指定大小

 

1.1.3 建立坐标系

 

#一个坐标系中可叠加多个类型的图

 

 

直接使用(用于只有一个坐标系)

plt.plot(x,y)           #类型为列表

 

add_subplot方法

ax1 = fig.add_subplot(1,1,1)  #建立一行一列一个坐标系,选择第一个

ax2= fig.add_subplot(2,1,1)  #建立两行一列两个坐标系,选择第一个

 

plt.subplot方法

ax1 = plt.subplot(2,3,1)  #建立两行三列六个坐标系,选择第一个

ax2 = plt.subplot(2,3,2)  #建立两行三列六个坐标系,选择第二个

ax1.plot(x,y)           #x轴数据用x。y轴数据用y,画折线图

ax1.bar(x,y)            #同时在ax1中画柱形图

 

plt.subplots方法(要用上面的fig)

fig,axes = plt.subplots(2,2)  #建立两行两列四个坐标系

axes[0,0].plot(xy)         #0,0坐标系画折线图

 

图表参数

color=      #颜色b蓝,y黄,c青,m品红,w白,k黑

linestyle    #solid实线,dashed短线,dotted点,dashdot短线和点

linewidth=3  #线宽度,浮点数

marker=’.‘    #折线图中每个点的形状

markersize      #每个点大小

markerfacecolor   #标记实心颜色

markeredgecolor   #标记外边颜色

markeredgewidth   #标记外边宽度

label            #图例

图表类型

plot 折线图

bar 柱形图

pie  饼图或圆环图

barh 条形图      #

scatter 散点图或气泡图

stackplot  面积图

polar   雷达图

boxplat  箱形图

imshow  热力图

1.1.4 绘图选项

 

设置标题

plt.title('上年开销',loc='right')  #设置标题并靠右,缺省center

 

填充色

plt.fill(x,y,color=’r’)        #使用指定颜色填充区域

 

c2线

plt.grid(True)                    #显示全部c2线

plt.grid(True,axis=’x’)            #只显示X轴c2线

plt.grid(True,linestyle=’dashed’)    #使用虚线

plt.grid(b = ‘True’)                #显示全部c2线

plt.grid(b = ‘True’,axis=’x’)         #只显示X轴c2线

plt.grid(b = ‘True’,axis=’y’)         #只显示Y轴c2线

数据标签

for a,b in zip(X轴数据,Y轴数据):

plt.text(a,b,b,ha=’center’,va=’bottom’,fontsize=11)

 标签用y轴的数据,即b

 ha:水平位置,left,right

va:垂直位置,top,bottom,center

fontsize:字体大小

水平线

plt.axhline(y =2 ,xmin=1,xmax=5)

  #平行于x轴,高度2,长度从1到5

垂直线

plt.axhline(x=2 ,ymin=1,ymax=2)

 

数据表

columns=[‘c1,’c2’,’c3’]    #列名

rows= [‘r1’,’r2’]          #行名,第一列

celltext = [ [231,233,678],

          [125,235,666]]  #数据行,两行数据

plt.table(cellText=celltext,     #数据

        cellLoc=’center’,     #位置

        rowLabels=rows,     #行

        rowLoc=’center’,

        colLabels=columns,

        cloLoc=’left’,            

        rowColours=[‘red’,’yellow’],     #行名颜色,逐个指定

        colColours=[‘red’,’yellow’,’red’],  #列名颜色

        loc=’bottom’)      #数据表位置

 

设置图例

ax1.plot(x,y,lable=’柱形图’)  #建坐标系时使用label参数

ax1.legend()                #将图例显示出来

ax1.legend(ncol=2)       #有多个图例时,默认展示在一列,ncol设置列数

ax1.legend(loc = ‘best’)    #loc参数指定图例位置,best自动

        upper right       #右上

        lower left        #左下

        center left       #左侧中心

        upper center    #顶部中心

        center           #正中心

其他参数

      fontsize

      prop

        facecolor   背景色

       edgecolor   边框颜色

      title         标题

      title_fontsize  标题大小

      shadow      阴影

1.1.5 坐标轴设置

 

坐标轴名称;

plt.xlabel('项目')                  #设置X轴名称

plt.ylabel('金额')                  #设置Y轴名称

plt.xlabel('项目',lablepad= 10)      #设置X轴名称到x轴的距离

      lablepad= 10               #名称到轴的距离

fontsize=’xx-large’         #大字体

color=’#123456’          #字体颜色

fontweight=’bold’         #字体加粗

 

设置坐标轴位置

默认坐标轴是4个边框,左边和下边的边框显示数值,用下面的方法改为4个象限

方法一:

x =np.arange(-10,10,0.1)

y = np.sin(x)

 

ax1 = plt.subplot(111)

ax1.plot(x,y)

ax1.spines['left'].set_position(('data',0))          #左边框位置移到0,y轴

ax1.spines['bottom'].set_position(('data',0))      #下边框位置0,x轴

ax1.spines['left'].set_color('r')                   #设置左边框(x轴)颜色

ax1.spines['top'].set_visible(False)              #隐藏上边框

ax1.spines['right'].set_visible(False)

plt.show()

 

方法二:可能只适用一个坐标系的情况

x =np.arange(-10,10,0.1)

y = np.sin(x)

 

plt.plot(x,y)                   #直接建坐标系

ax = plt.gca()                 #这行是重点,下面没区别

ax.spines['left'].set_position(('data',0))

ax.spines['bottom'].set_position(('data',0))

ax.spines['left'].set_color('r')

ax.spines['top'].set_visible(False)

ax.spines['right'].set_visible(False)

plt.show()

 

坐标轴刻度范围

plt.xlim(0,12)        #x轴最小值0,最大12

 

坐标轴刻度值和标签

默认刻度为数值,可自定义。坐标轴名称中的文本设置均可用

plt.xticks(列表1,列表2)     #列表一刻度值,列表二标签

plt.yticks(列表1,[‘一月’,’二月‘])

plt.yticks([1,2],[‘一月’,’二月‘])

 

坐标轴刻度值位置

ax1.xaxis.set_ticks_position(‘bottom’)  #x轴刻度值显示在x轴下方,缺省

ax1.yaxis.set_ticks_position(‘left’)     #y轴刻度值显示在y轴左侧,缺省

不显示刻度值和标签

plt.xticks([])

 

坐标轴等长

ax2.axis('square')    #两个轴范围相同

ax.axis('equal')      #两个轴刻度等长

 

不显示X轴和Y轴

plt.axis(‘off’)

 

双坐标轴

在设置好第一个坐标轴后,输入以下语句,然后同样的方法再绘制一个,参数都一样

plt.twinx()        #双y轴

 

plt.twiny()        #双x轴

 

 

1.1.6 收尾

 

保存图片

plt.savefig(src,facecolor=’w’)     #背景色黑

展示图片

plt.show( )    

1.1.7 常用图形

圆(极坐标)

theta = np.arange(0 , 2*np.pi , 0.0001)

x = 2*np.cos(theta)

y = 2*np.sin(theta)

 

ax1 = plt.subplot(111)

ax1.plot(x,y)

ax1.spines['left'].set_position(('data',0))

ax1.spines['bottom'].set_position(('data',0))

ax1.spines['top'].set_visible(False)

ax1.spines['right'].set_visible(False)

ax1.axis('equal')                       #等长

 

圆(方程)

x = np.arange(-2,2,0.0001)

y = np.sqrt(2-x**2)

 

ax1 = plt.subplot(111)

ax1.plot(x,y)

ax1.plot(x,-y)

ax1.spines['left'].set_position(('data',0))

ax1.spines['bottom'].set_position(('data',0))

ax1.spines['top'].set_visible(False)

ax1.spines['right'].set_visible(False)

ax1.axis('equal')

ax1.fill(x,y,color='r')              #红色填充

ax1.fill(x,-y,color='r')

 

8.2绘图seaborn

 

 

8.3绘图pyecharts

 

from pyecharts.charts import Bar

from pyecharts.charts import Line

from pyecharts import options as opts

from pyecharts.globals import ThemeType  #主题,内置主题类型可查看 pyecharts.globals.ThemeType

 

# 使用 snapshot-selenium 渲染图片

#from pyecharts.render import make_snapshot

#from snapshot_selenium import snapshot

src = r'C:\tmp\2.html'

x_data = ["1月", "2月", "3月", "4月", "5月", "6月"]

bar = (

    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))                #bar柱状图, 并设置主题

    .add_xaxis(xaxis_data=x_data)    #横坐标

    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])                       #纵坐标

    .add_yaxis("商家B", [15, 6, 45, 20, 35, 66])

    .set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"),   #可以没有标题

          toolbox_opts=opts.ToolboxOpts(),      #添加右侧工具栏                    

     xaxis_opts=opts.AxisOpts(name="我是 X 轴"),  #坐标轴起个名字               

                     )

    )

 

y_data = [2.0, 2.2, 3.3, 4.5, 6.3, 10.2]

y_data = [i*10 for i in y_data]

line = (

    Line()

    .add_xaxis(xaxis_data=x_data)        #横坐标数据                         

    .add_yaxis(series_name='气温',y_axis=y_data,color="#675bba")      #纵坐标数据,配置颜色,series_name可省略

)

 

bar.add_js_funcs("""var img = new Image(); img.src = 'https://s2.ax1x.com/2019/07/08/ZsS0fK.jpg';""")  #背景图片

#bar.render(src)           #生成html页面,并指定路径,缺省当前python文件目录

bar.overlap(line)    #叠加折线图和柱状图,

bar.render(src)      #生成html

#bar.render_notebook()  #使用jupter

#make_snapshot(snapshot, bar.render(), "bar.png")       #生成图片

posted @ 2021-08-07 20:08  化身天使  阅读(470)  评论(0)    收藏  举报