浅谈第三方图表库绘图原理

        因为近半年时间都在做数据分析,可视化方面的工作,接触了很多图表库,python生态里图表库是非常多的,有窗口形式的,有web网页形式的,技术不尽相同,但是绘图原理基本差不多。回想以前,我对图表绘制这块的理解还是比较浅的,经过半年的历练,我对图表绘制又有了新的认识,特别是对一        些图表的隐藏操作,也可以说默认操作有了新的发现。

        其实,总结下来,我觉得带坐标系的主要有两种图,一种是有序图,一种是无序图,当然这两个分类是我定义,那么什么是有序图,有序图就是横坐标是有序的,并且一般是从小到大顺序,或者是时间,或者数字,常见的基本就这两种,纵坐标一般表示因变量,表示随着x的变化,y的变化,图的形式一般是散点或者折线。无序图就是横坐标是标签形式的,着重表示类别,表示对比功能,图的形式一般是柱状图,条形图,箱线图等。

        当我们要绘制一个数据的时候,一般绘图库会根据绘制的图表形式,确定图表是有序的,还是无序的,比如,要绘制一个数据折线图,那么图表库会自动给一个有序的横坐标,一般是自然数列,如果我们的数据有两列,那么,它会绘制两条线,下面是一个例子。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


#fig,ax = plt.subplots()
df = pd.DataFrame({
    'a': [5,4,3,2,1],
    'b': [32,24,64,45,75],
})
df.plot()

 我们可以看到,这个图的横坐标不是数据里的数据,而是图表库自己生成的一个自然数列,然后数据里的两个列都变成折线了,这时候就会出现一个问题,有些时候,我们并不想用库自己生成的序列做横轴,而是想用的自己数据里的一列,这当然没什么问题,但是需要注意一个问题,就是如果我们指定的这一列本身就是从小到大排序的,那就没事,但是如果我们指定的这列是乱序的或者倒序的,怎么办呢,这是不是就和前面说的矛盾了,前面说到,横坐标必须是有序的,这时候图表库就会有个隐藏操作,首先,它会根据你横坐标的数据类型生成一个坐标轴,然后按数据的原始顺序绘制图像,下面演示了这种情况

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


fig,ax = plt.subplots()
df = pd.DataFrame({
    'a': [4,5,1,3,2],
    'b': [32,24,64,45,75],
})
ax.plot(df['a'],df['b'])

                           

 由于原始数据中横坐标不是从小到大排序的,所以画出来的图像有点奇怪,(4,32)其实是折线的起点,(2,75)是终点。从这个例子能看出什么呢,首先图像一共5个点,绘制的顺序如何,这5个点的坐标是不变的,也就是5个点的位置是一样的,区别就是怎么用线把5个点连起来,因为横轴坐标是有序的,所以肯定是按从小到大连起来看起来是最正常的,因为它更符合直觉,然而怎么让图表库从小到大连接呢,答案就是按df['a']排序,首先把做横坐标的数据从小到大排序,但同时还应该保持两者的对应关系,那么可以用df = df.sort_values(by='a')给df排下序,再绘制就正常了

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


fig,ax = plt.subplots()
df = pd.DataFrame({
    'a': [4,5,1,3,2],
    'b': [32,24,64,45,75],
})
df = df.sort_values(by='a')
ax.plot(df['a'],df['b'])

 可以看到,其实5个点的坐标是没变化的,还是那5个点,只不过连接顺序发生了变化(绘制顺序),怎么发生这种变化,给数据按横坐标数据列排序,注意要保持对应关系,而不是只给横坐标数据列排序。

        另外一种是无序图表。比如箱线图,这种图表因为不是为了看趋势,而是看某种数据的分布,不同数据有不同的分布,所以它一般是没有横轴的,或者说横轴一般表示类别,下面是一个例子。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
import matplotlib.dates as mdates
from matplotlib.pyplot import MultipleLocator,AutoLocator
from matplotlib.dates import DateFormatter,AutoDateFormatter

df = pd.DataFrame({
    '2022-12-03 01:01:01':np.arange(10),
    '2022-12-03 02:02:02':np.arange(10),
    '2022-12-04 01:01:01':np.arange(10),
    '2022-12-05 01:01:01':np.arange(10),
    '2022-12-06 01:01:01':np.arange(10),
    '2022-12-07 01:01:01':np.arange(10),
    '2022-12-08 01:01:01':np.arange(10),
})
df.columns = pd.to_datetime(df.columns,format='%Y-%m-%d %H:%M:%S')
bp = df.boxplot(figsize=(15,8))
formatter = DateFormatter('%Y-%m-%d')
#bp.xaxis.set_major_formatter(formatter)
bp.xaxis.set_major_locator(AutoLocator())

 乍一看,好像也有个横轴,但仔细一看,前面两个数据时间是同一天的,和后面的时间间距根本不一样,但是图像还是等间距的,所以,很显然,图表库并没有生成一个坐标轴(因为坐标轴的的刻度肯定是线性递增的,当然不考虑对数坐标),这种图,坐标轴上的刻度标签只表示类别,我这个数据是故意弄成时间,其实多数情况下,这个数据都是字符串,比如,苹果、橘子、香蕉、西瓜等,所以绘制这种图的时候,要注意这种图是没横坐标的,因为横坐标没意义,横坐标只表示类别,起到区别,对比的作用,当然我们可以人为的给这些标签排序,但是需要和坐标轴区分,坐标轴是刻度等分的,即刻度之间间距相等,而这种图是图像之间等间距,横坐标可以等间距,也可以不等间距,横坐标不明确表示顺序,更多表示类别。

        总的来说,图表的绘图逻辑和图表的类别有关,一般图表可分为两类,一类是散点,折线,一类是条形图,箱线图,即有序,和无序,有序的图表库会自动生成一个横坐标轴,并把点按原始数据顺序绘制在坐标系上,如果想排序,需要自己把数据排序,图表库不会自动排序,并且点与点之间可能不是等间距的,完全取决于数据。无序图,无坐标轴,只是把各个类别数据的标签平铺绘制,各个柱子或者箱子等间距。

猜你喜欢

转载自blog.csdn.net/zy1620454507/article/details/128326768
今日推荐