python 可视化探索(一):基础图表

总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o)

原作者:作者:大话数据分析,知乎、公众号【大话数据分析】主理人,5年数据分析经验,前蚂蚁金服数据运营,现京东经营分析师。

原活动链接

第一节 Matplotlib基础图表

本节聚焦matplotlib基础知识和基本图表,你将掌握数据可视化的基础和实践技能,通过学习安装、配置和个性化设置,确保图表的专业性和易读性。并且,学会根据数据类型选择折线图、柱状图、散点图或饼图来展示和分析数据,提升数据驱动的决策能力,在经管领域有更多的实践应用。

一、Matplotlib基础知识

0. 初识Matplotlib

  • Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

  • Matplotlib 可以用来绘制各种静态,动态,交互式的图表,我们熟知的Seaborn,Pandas的绘图接口也是基于Matplotlib做了更高级的封装。

  • Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。

  • Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。

简单的例子

为了对Matplotlib有一个更好的理解,我们来通过一个简单的例子来认识它~


通过Jupyter的魔法命令%matplotlib inline 可以直接在jupyter notebook中展示图表,不需要每个图表都是用plt.show()来展现来~

%matplotlib inline
import matplotlib.pyplot as plt

figure, axes = plt.subplots()  # 创建一个包含一个axes的figure
axes.plot([1, 2, 3, 4], [1, 4, 2, 3])  # 绘制图像
[<matplotlib.lines.Line2D at 0x1b0ada61300>]

在这里插入图片描述

总共就三行代码,我们依次来看一下:

import matplotlib.pyplot as plt  

引入Matplotlib并命名为plt,注意这个引入的是matplotlib.pyplot而不是直接引入matplotlib;


figure, axes = plt.subplots()  # 创建一个包含一个axes的figure  

通过plt.subplot()命令来创建FigureAxesaxes是我们绘图的坐标系,figure是我们绘图的窗口,这也是在Matplotlib非常重要的两个概念;

  • Figure:顶层级,所有图表的容器,我们可以理解为窗口(Pyecharm等IDE中是弹出的窗口,Jypyter中为内嵌的窗口),一个Figure中可以包含多个Axes;

  • Axes:坐标系,也就是对应我们画的每一个图表,在Axes我们可以对图表的坐标轴(axis),刻度值(Tick)等进行操作;


axes.plot([1, 2, 3, 4], [1, 4, 2, 3])  # 绘制图像  

绘制图表的代码,相当于给我们的axes绑定数据,.plot()是绘制折线图,如果是柱形图边换成.bar()然后进行相应的数据绑定;


在上面的例子中,我们通过plt.subplot()命令来创建FigureAxes,然后再对axes进行数据的绑定,这应该是一种符合规矩的编码方式,但其实并不是最便利的;

我们还可以通过一个更简单的方法来创建,matplotlib.pyplot方法能够直接在当前axes上绘制图像,如果用户未指定axes,matplotlib会帮你自动创建一个。

所以上面的例子也可以简化为以下这一行代码。

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [1, 4, 2, 3])  
[<matplotlib.lines.Line2D at 0x1b0afc8d2d0>]

在这里插入图片描述

1.Matplotlib导入

什么是Matplotlib?

Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形,它是Python中最常用的可视化工具之一,功能非常强大,可以通过调用函数轻松方便地绘制数据分析中常见的各种图像,比如折线图、条形图、柱状图、散点图、饼图等。

import warnings
import matplotlib.pyplot as plt

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

warnings.filterwarnings("ignore") # 忽略警告信息
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号
plt.rcParams['figure.dpi'] = 100  # 分辨率

plt.style.available是Matplotlib库中的一个属性,用于列出所有可用的图表样式。Matplotlib预先定义了很多不同图表样式,使用这些样式,你可以轻松地改变图表的外观,例如颜色、线条风格等。

plt.style.available#查看matplotlib库的绘图样式
['Solarize_Light2',
 '_classic_test_patch',
 '_mpl-gallery',
 '_mpl-gallery-nogrid',
 'bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn-v0_8',
 'seaborn-v0_8-bright',
 'seaborn-v0_8-colorblind',
 'seaborn-v0_8-dark',
 'seaborn-v0_8-dark-palette',
 'seaborn-v0_8-darkgrid',
 'seaborn-v0_8-deep',
 'seaborn-v0_8-muted',
 'seaborn-v0_8-notebook',
 'seaborn-v0_8-paper',
 'seaborn-v0_8-pastel',
 'seaborn-v0_8-poster',
 'seaborn-v0_8-talk',
 'seaborn-v0_8-ticks',
 'seaborn-v0_8-white',
 'seaborn-v0_8-whitegrid',
 'tableau-colorblind10']
#选择设置图表演示为ggplot类型
plt.style.use("ggplot") 

在绘制图表之前,通常会先使用 plt.figure()来初始化图形窗口,这样可以确保接下来的绘图操作都在这个特定的窗口上进行。同时,通过指定 figsize参数值,可以控制图形的大小。简单来讲,建立画布就相当于你选择多大的一块“布”去作画。

#设置图表画布大小,设置其尺寸为宽9英寸和高6英寸
plt.figure(figsize = (9, 6)) 
<Figure size 900x600 with 0 Axes>




<Figure size 900x600 with 0 Axes>

2.折线图绘制示例

坐标轴标题、轴显示、图表标题、图例设置

在使用matplotlib进行图表绘制时,我们经常会进行一系列的设置以确保图表具有清晰、直观的视觉效果。这些设置包括坐标轴标题的设置,用于标明每个坐标轴所代表的数据含义;图表标题设置,用于给整个图表添加一个描述性的标题,帮助观众快速理解图表的主题;图例设置,当图表中包含多条数据曲线或多种数据标记时,可以通过图例来区分不同的数据系列,使得图表更加易于解读;还有轴显示设置,可以控制坐标轴的显示方式,如刻度的间隔、范围等;。

Tips:使用plt.plot()命令,只要在括号()传入数据,即可生成一个折线图,但是,对于做可视化来说,最难的是里面的图表元素设置,只有通过细致的设置图表元素,一张精美的图表才会成型。

#### 绘制一个简单的折线图
import pandas as pd
import numpy as np
import warnings
import matplotlib.pyplot as plt 
import matplotlib.style as psl

# #魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

warnings.filterwarnings("ignore") # 忽略警告信息
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号
plt.rcParams['figure.dpi'] = 100  # 分辨率

#使用Series模拟一组数据
s = pd.Series(data=np.random.randn(3600), 
               index=pd.date_range('20130101',periods=3600),
             )

cs = s.cumsum()#累计和

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小
plt.title('近10年网页浏览量数据趋势', loc = "center")
plt.xlabel("年份",labelpad = 20) #设置X轴距离,labelpad控制标题到图表的距离
plt.ylabel("网页浏览量",labelpad = 20) #设置Y轴距离,labelpad控制标题到图表的距离
plt.legend(loc = "upper center",title='浏览量',title_fontsize=10,frameon=False) #frameon=False,图例去除边框
# plt.axis("off") #简化图表,可关闭坐标轴及标题

cs.plot(figsize = (9, 6))#设置图表大小
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.





<Axes: title={'center': '近10年网页浏览量数据趋势'}, xlabel='年份', ylabel='网页浏览量'>

在这里插入图片描述

⏳跟练题目1

跟练1:你是一名业务分析师,在某次的业务研讨会中,你展示了近10天的累计业务量达成情况,如下所示,但是整体图表缺少图表标题、坐标轴标题、图例这些元素,受众中无法理解你所表达数据的含义,你需要在该图表中添加图表标题、坐标轴标题、图例。

Image Name

💡 提示:使用plt.plot()函数导入参数设置数据值np.arange(10)、plt.title()设置图表标题、plt.xlabel() 设置X轴标题、plt.ylabel() 设置Y轴标题、plt.legend()设置图例。

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

# %matplotlib inline
# %config InlineBackend.figure_format = 'svg'

s = pd.Series(
    data = np.arange(10),
    index = pd.date_range('20240521',periods=10)
)
cs = s.cumsum()
print(cs)
cs.plot(figsize = (9,6))

plt.xlabel("日期",labelpad = 20)
plt.ylabel("业务量",labelpad = 20)

plt.title('近10天累计业务量数据趋势', loc = "center")
plt.legend(loc = "upper center",title='累计业务量',title_fontsize=10,frameon=False)
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.


2024-05-21     0
2024-05-22     1
2024-05-23     3
2024-05-24     6
2024-05-25    10
2024-05-26    15
2024-05-27    21
2024-05-28    28
2024-05-29    36
2024-05-30    45
Freq: D, dtype: int32





<matplotlib.legend.Legend at 0x23a0f302eb0>

在这里插入图片描述

3.基本图表设置

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

df = pd.DataFrame(data=np.random.randint(low=100, high=1000, size=30),
                  index=pd.date_range('20231101', periods=30),
                  columns=['销量'])

df.plot(
    color="red",
    linestyle="--",
    linewidth=2,
    marker="o",
    markersize=5,
    figsize=(9,6)
    )

plt.xticks(
    ticks=pd.date_range('20231101',periods=30),
    labels=['{}日'.format(i +1) for i in range(30)],
    rotation=45)  # 设置X坐标轴刻度
    
plt.yticks(
    ticks=np.arange(100, 1100, 100),
    labels=['{}单'.format(i*100) for i in range(10)])  # 设置Y坐标轴刻度

plt.ylim(0, 1200)  # 设置Y轴坐标最小值与最大值

# 数据标签
for x,y in zip(pd.date_range('20231101',periods=30), df['销量'].values):
    plt.text(x,y,y, ha = "center", va = "bottom", fontsize = 9)
    
plt.grid(
    color='red',
    linestyle='--',
    alpha=0.3,
    axis='y',
    visible=True,
)  # 设置网格线为虚线,axis='y'可只对Y轴打开网格线
<Figure size 900x600 with 0 Axes>

在这里插入图片描述

⏳跟练题目2

跟练2:假如你是一名电商销售数据分析师,现有近10个月销售业务量达成数据np.arange(10),你需要设计一个折线图,包含基本的图表元素,能直观地反映业务量的达成和趋势情况。

💡 提示:使用plt.plot()函数导入参数设置数据值、线型、点型,plt.title()设置标题,plt.grid()设置网格线,做出来的图表应与下面的图表类似

Image Name

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

# %matplotlib inline
# %config InlineBackend.figure_format = 'svg'

s = pd.Series(
    data = np.arange(10),
    index = pd.date_range('20240501',periods=10)
)
# cs = s.cumsum()
# print(cs)
# cs.plot(figsize = (9,6))

fig, ax = plt.subplots(figsize=(9, 6), facecolor='white')

s.plot(
    ax = ax,
    color="red",
    linestyle="--",
    linewidth=2,
    marker="o",
    markersize=5,
    # figsize=(9,6),
)
ax.set_facecolor('white')

plt.xlabel("日期",labelpad = 20)
plt.ylabel("业务量",labelpad = 20)

plt.xticks(
    ticks=pd.date_range('20240501',periods=10),
    labels=['{}日'.format(i +1) for i in range(10)],
    rotation=45)  # 设置X坐标轴刻度
    
plt.yticks(
    ticks=np.arange(0, 10, 1),
    labels=['{}单'.format(i) for i in range(10)])  # 设置Y坐标轴刻度

plt.title('近10天业务量数据趋势', loc = "center")
plt.legend(loc = "upper center",title='业务量',title_fontsize=10,frameon=False)

# plt.ylim(0, 11)  # 设置Y轴坐标最小值与最大值

for x,y in zip(pd.date_range('20240501',periods=10), s.values):
    plt.text(x,y,y, ha = "center", va = "bottom", fontsize = 15)

plt.grid(
    color='red',
    linestyle='--',
    alpha=0.3,
    axis='both',
    visible=True,
)  # 设置网格线为虚线,axis='y'可只对Y轴打开网格线
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

在这里插入图片描述

4.共轴坐标轴

在图表制作中,共享坐标轴指的是多个子图之间共享相同的Y轴或X轴。通过共享坐标轴,可以更好地比较不同子图之间的数据,因为它们都在相同的尺度上进行展示,特别是当需要对比多个相关图表时,共享坐标轴可以更能展现数据上的差异。

4.1共Y坐标轴

做多个数据系列折线图时默认是共用Y轴的,以下是多个系列数据共用一个Y坐标轴,可以展示不同系列数据在时间趋势上的波动变化。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

# #魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

df = pd.DataFrame(np.random.randn(2000, 4),
                  index=pd.Series(pd.date_range('20230101', periods=2000)),
                  columns=list('ABCD')
                  )

df = df.cumsum()
df.plot(figsize=(9, 6))
plt.legend(loc='best')

<matplotlib.legend.Legend at 0x23a109a9610>




<Figure size 900x600 with 0 Axes>

在这里插入图片描述

4.2共X坐标轴

如果要共用一个X坐标轴,Y坐标轴分别展示,可设置参数subplots=True,这样设置为共X坐标轴数据图。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

df = pd.DataFrame(np.random.randn(2000, 4),
                  index=pd.Series(pd.date_range('20230101', periods=2000)),
                  columns=list('ABCD')
                  )

df = df.cumsum()
df.plot(figsize=(9, 6), subplots=True,)

plt.legend(loc='best')

<matplotlib.legend.Legend at 0x23a1088feb0>




<Figure size 900x600 with 0 Axes>

在这里插入图片描述

5.综合案例

以下,借助一个可视化案例研究双十一销售量数据趋势。通过分析双十一销售量的数据趋势,我们可以获得宝贵的洞察和启示,有助于我们深入理解消费者购买行为、市场趋势和电商平台的运营策略。这样的研究能够帮助我们洞察消费者需求的变化,以及市场竞争的态势,为企业制定精准的营销策略提供数据支持。

通过研究双十一销售量数据趋势,我们可以更好地把握市场动态,提升企业的运营效率和竞争力,实现可持续的商业发展。对于经管专业的学习者而言,掌握这种数据分析能力将成为在未来职场中不可或缺的重要技能,下面使用一个综合数据可视化案例,来研究双十一销售量数据趋势。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

df = pd.DataFrame(data=np.random.randint(low=100, high=1000, size=30),
                  index=pd.date_range('20231101', periods=30),
                  columns=['销量'])

df.plot(
    color="red",
    linestyle="dashdot",
    linewidth=1,
    marker="o",
    markersize=5,
    figsize=(9,6))

plt.xlabel("年份", labelpad=20)  # 设置X轴距离,labelpad控制标题到图表的距离
plt.ylabel("电商销售量", labelpad=20)  # 设置Y轴距离,labelpad控制标题到图表的距离

plt.title('双十一销售量数据趋势', loc="center")

plt.legend(loc="upper center", title='销量', title_fontsize=10, frameon=False)

plt.xticks(
    pd.date_range('20231101', periods=30), 
    ['{}日'.format(i+1) for i in range(30)], 
    rotation=45)  # 设置X坐标轴刻度

plt.yticks(
    np.arange(100, 1100, 100), 
    ['{}单'.format(i*100) for i in range(10)])  # 设置Y坐标轴刻度
    
plt.ylim(0, 1100)  # 设置Y轴坐标最小值与最大值
plt.grid(visible=True, linestyle='dashed')  # 设置网格线为虚线,axis='y'可只对Y轴打开网格线

for a, b in zip(pd.date_range('20231101', periods=30), df['销量'].values):
    plt.text(a, b, b, ha="center", va="bottom", fontsize=9)

<Figure size 900x600 with 0 Axes>

在这里插入图片描述

二、Matplotlib基础图表

1.图表选择

选择合适的图表类型对于有效地传达数据信息非常重要。在选取图表时需要考虑你想要传达的信息、数据的性质和数量,以及你的受众情况,根据这些因素来选择最能有效地传达你的信息的图表类型。以下是一些常见的图表类型可供选择:

  • 比较数据:当你需要比较不同类别或不同时间点的数据时,条形图和饼图是很好的选择。条形图可以用来比较不同类别的数据,而饼图则可以用于展示部分与整体的关系。
  • 趋势分析:如果你想展示数据的趋势,例如随时间的变化,线形图或柱状图是很好的选择。线形图适用于时间序列数据,而柱状图则在类别数据上效果更好。
  • 部分与整体的关系:饼图或堆叠条形图可以用来展示部分与整体的关系。饼图适用于简单的比例关系,而堆叠条形图可以用于显示不同类别的累积效应。
  • 相关性分析:如果你想展示两个变量之间的关系,散点图是好的选择。通过散点图,你可以观察到两个变量之间的趋势和关联。
  • 时间序列数据:如果你正在处理时间序列数据,例如温度随时间的变化,那么线形图或者柱状图(如果时间被解释为类别)可能都会很有效。
  • 多变量数据:如果你有多维度的数据需要展示,例如多个产品在不同地区和时间的销售情况,可能需要使用更复杂的图表类型,如热力图、小提琴图等。

图表建议思维指南

Image Name

2.折线图

折线图是一种用折线的升降来表示统计数据变动趋势的图形。它通常用于显示数据随时间或有序类别的波动情况,可以清楚地反映数据增减变化的趋势和变化幅度。在折线图中,每个数据点通常通过线段连接,形成一条连续的折线,从而展示数据的动态变化。

**plt.plot():**用于绘制折线图。

函数签名

plt.plot(x, y, color, linestyle, linewidth, **kwargs)

参数解释

  • x, y: 表示数据的x和y坐标。这些是绘制图形所必需的基本参数;
  • color:控制线条的颜色。可以传入颜色的名称,例如’red’,'green’等;
  • linestyle:线条的风格。可以是’-‘(实线),’–‘(虚线),’-.‘(点划线),’:'(点线)等;
  • linewidth:线条的宽度。可以设定线条的粗细;
  • marker:数据点的标记。可以是’.'(点),‘o’(圆圈),‘s’(方块),‘d’(菱形)等;
  • markersize:标记的大小。可以设定数据点的大小;
  • markeredgecolor:标记边缘的颜色;
  • markerfacecolor:标记填充的颜色;
  • markeredgewidth:标记边缘的宽度;
  • label:用于图例的标签;
  • **kwargs:表示其他关键字参数的集合。这些参数用于控制线条的样式、颜色、标记等属性。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

#导入数据
df=pd.DataFrame(data={'日期': pd.date_range('20231101',periods=30),
                      '销售数': np.random.randint(low=100,high=1000,size=30),
                      '销售额': np.random.randint(low=1000,high=10000,size=30)}
               )
x=df['日期'].astype('str').tolist()
y=df['销售数'].tolist()

plt.plot(x,y,color="red",linestyle= "--",linewidth=1,marker="o",markersize=5)

plt.xlabel("日期",labelpad = 20) #设置X轴距离,labelpad控制标题到图表的距离
plt.ylabel("电商销售数",labelpad = 20) #设置Y轴距离,labelpad控制标题到图表的距离

plt.title('双十一销售量数据趋势', loc = "center")

plt.xticks(x, ['{}日'.format(i+1) for i in range(30)],rotation=45)#设置X坐标轴刻度

plt.grid(visible = True,linestyle='dashed')#设置网格线为虚线,axis='y'可只对Y轴打开网格线

for a,b in zip(x, y):
    plt.text(a,b,b, ha = "center", va = "bottom", fontsize = 9)

plt.show()

在这里插入图片描述

3.柱形图

柱形图是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。柱形图各柱体表示数据的分类项,柱体的高度表示该类别的数据值。

**plt.bar():**用于绘制柱形图。

函数签名

plt.bar(x, height, width, color, linewidth, align, **kwargs)

参数解释

  • x, height:x 为柱形图的 x 坐标,height 则为柱形的高度。这两个参数是必需的。
  • width:柱形的宽度。默认为 0.8。
  • color, edgecolor:分别用于设置柱形的填充颜色和边缘颜色。可以是单一颜色格式或包含多种颜色的序列。
  • linewidth:柱形边缘的线宽。
  • align:设置柱形与 x 坐标的对齐方式,可以是 ‘center’ 或 ‘edge’。默认为 ‘center’。
  • tick_label:用于 x 轴的刻度标签。
  • label:用于图例的标签。
  • alpha:柱形的透明度,范围在 0 到 1 之间。
  • hatch:用于填充柱形的斜线样式,例如 ‘/’、‘’、‘|’、‘-’ 等。
  • log:是否使用对数刻度。默认为 False。
  • ecolor:柱形误差线的颜色。
  • capsize:柱形误差线帽的大小。
  • **kwargs:表示其他关键字参数的集合。这些参数用于控制柱形的样式、颜色、标记等属性。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

#导入数据
df=pd.DataFrame(data={'客户性别':['男','女'],
                      '销售数': np.random.randint(low=100,high=5000,size=2)}
               )

x=df['客户性别'].tolist()
y=df['销售数'].tolist()

#绘制柱状图
plt.bar(x, y, width = 0.2, align = "center", label = "销售量")

plt.title("不同性别客户销售数", loc="center")#设置标题

#添加数据标签
for a,b in zip(x, y):
    plt.text(a,b,b,ha = "center", va = "bottom", fontsize = 12)

plt.xlabel("客户性别")#设置x和y轴的名称
plt.ylabel("销售数")

plt.legend()#显示图例
plt.show()#显示图像

在这里插入图片描述

⏳跟练题目3

跟练3:上面你做了一个折线图,但是,柱形图也可以展示业务量的达成和趋势,请将上面的图表类型转换为柱形图,并添加数据标签,使得数据信息表达和呈现更加直观。

💡 提示:plt.bar()导入数据值np.arange(10)+1可作柱形图,plt.text()可添加数据标签,做出来的图表应与下面的图表类似

Image Name

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

# %matplotlib inline
# %config InlineBackend.figure_format = 'svg'

s = pd.Series(
    data = np.arange(10),
    index = pd.date_range('20240501', periods=10)
)

fig, ax = plt.subplots(figsize=(9, 6), facecolor='white')

s.plot(
    kind='bar',
    ax=ax,
    color="blue",
)
ax.set_facecolor('white')

plt.xlabel("日期", labelpad=20)
plt.ylabel("业务量", labelpad=20)

plt.xticks(
    ticks=range(10),
    labels=['{}日'.format(i + 1) for i in range(10)],
    rotation=45  # 设置X坐标轴刻度
)
plt.yticks(
    ticks=np.arange(0, 10, 1),
    labels=['{}单'.format(i) for i in range(10)]  # 设置Y坐标轴刻度
)

plt.title('近10天业务量数据趋势', loc="center")
plt.legend(['业务量'], loc="upper center", title='业务量', title_fontsize=10, frameon=False)

# plt.ylim(0, 11)  # 设置Y轴坐标最小值与最大值

for i, (x, y) in enumerate(zip(pd.date_range('20240501', periods=10), s.values)):
    plt.text(i, y, y, ha="center", va="bottom", fontsize=15)

plt.grid(
    color='red',
    linestyle='--',
    alpha=0.3,
    axis='y',
    visible=True,
)  # 设置网格线为虚线,axis='y'可只对Y轴打开网格线

plt.show()

在这里插入图片描述

4.条形图

条形图是用宽度相同的条形的高度或长短来表示数据变动的图形。条形图可以横置或纵置,纵置时也称为柱形图,可横向做分类对比。

**plt.barh():**用于绘制条形图。

函数签名

plt.barh(y, width, height, color, edgecolor, linewidth, **kwargs)

参数解释

  • y, width:y为柱形图的y坐标,width则为柱形的宽度。这两个参数是必需的;
  • height:柱形的高度;
  • color:设置柱形的颜色;
  • edgecolor:柱形的边框颜色;
  • linewidth:柱形边框的宽度;
  • align:柱形的水平对齐方式,通常可以是’center’或’edge’;
  • xerr, yerr:分别表示x和y方向上的误差条,可以用于绘制误差条;
  • ecolor:误差条的颜色;
  • capsize:误差条两端的宽度;
  • label:图例的标签;
  • **kwargs:表示其他关键字参数的集合。这些参数用于控制条形图的样式、颜色、标记等属性。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

#导入数据
df=pd.DataFrame(data={'商品品类':['床品件套','厨房电器','汽车配件','浴室用品',
                              '卧室家具','电脑硬件','家装饰品','办公家具'],
                      '销售数': np.random.randint(low=100,high=5000,size=8)}
               )

x=df['商品品类'].tolist()
y=df['销售数'].tolist()

#绘制柱状图
plt.barh(x, width = y, height = 0.5, align = "center", label = "销售数")

#设置标题
plt.title("不同商品品类销售数", loc="center")

#添加数据标签
for a,b in zip(x, y):
    plt.text(b,a,b,ha = "left", va = "center", fontsize = 12)

plt.xlabel("销售数")
plt.ylabel("商品品类")#设置x和y轴的名称

plt.legend()#显示图例
<matplotlib.legend.Legend at 0x23a1145f7c0>

在这里插入图片描述

5.饼图

饼图是用圆形及圆内扇形的角度来表示数值大小的图形,它主要用于表示一个样本(或总体)中各组成部分的数据占全部数据的比例。饼图通常用于显示数据系列中每一项占该系列数值总和的比例,常常被用来展现数据的分布情况。

**plt.pie():**用于绘制饼图。

函数签名

plt.pie(x, explode=None, labels=None, colors=None, autopct=None,pctdistance=0.6, labeldistance=1.1, startangle=None,radius=None, counterclock=True, wedgeprops=None, textprops=None,center=(0, 0),framesize=6, rotatelabels=False, *, normalize=False, data=None)

参数解释

  • x:数组类型,用于指定每个扇形区域的大小。这些值将被归一化,所以它们的总和为1,每个值对应饼图的一个部分;
  • explode:用于设置饼图每个部分离中心的距离。默认为None,表示所有部分都紧贴着中心。如果提供一个数组,则数组的长度应与x的长度相同,并且每个元素表示对应部分离中心的距离;
  • labels:列表字符串,用于设置每个饼图部分的标签。默认为None;
  • colors:用于设置饼图部分的颜色。可以是颜色名称、RGB元组或十六进制颜色字符串。如果为None,将使用Matplotlib的默认颜色循环;
  • autopct:字符串或函数,用于控制饼图百分比的显示方式。如果为字符串,可以使用格式化的浮点数(例如’%.1f%%')。如果为函数,函数应接收一个百分比值,并返回一个字符串;
  • pctdistance:浮点数,用于设置百分比标签与圆心的距离,默认为0.6;
  • labeldistance:浮点数,用于设置标签与圆心的距离,默认为1.1;
  • startangle:浮点数,用于设置饼图的起始角度,默认为从x轴正半轴开始逆时针计算角度;
  • radius:浮点数或两个浮点数的元组,用于设置饼图的半径。如果为单个浮点数,则所有饼图部分都有相同的半径。如果为元组,则第一个元素为内半径(用于生成环形饼图),第二个元素为外半径;
  • counterclock:布尔值,用于设置饼图是顺时针还是逆时针排列,默认为True(逆时针);
  • wedgeprops:字典类型,用于设置饼图部分的属性,例如边缘颜色、线宽等;
  • textprops:字典类型,用于设置文本标签的属性,例如字体大小、颜色等;
  • center:两个浮点数的元组,用于设置饼图的中心点位置。默认为(0, 0);
  • framesize:整数,用于设置饼图的框架大小;
  • rotatelabels:布尔值,用于设置标签是否应旋转以与饼图部分对齐。默认为False;
  • normalize:布尔值,是否将输入数据归一化到1。如果为True,则忽略数据中的任何缺失值。默认为False;
  • data:可选参数,接受一个字典或可以转换为字典的对象。此参数与x参数互斥。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入matplotlib包
import matplotlib.style as psl

#魔法命令,用于在笔记本内联显示matplotlib图表
# %matplotlib inline 
# #确保图表以SVG格式显示
# %config InlineBackend.figure_format = 'svg' 

psl.use('ggplot')
plt.figure(figsize = (9, 6)) #设置图表画布大小

#导入数据
df=pd.DataFrame(data={'区域':['华东','华北','东北','西北','西南','华南'],
                      '销售数': np.random.randint(low=100,high=5000,size=6)}
               )

#导入数据
x=df['销售数'].tolist()
labels = df['区域'].tolist()
explode = [0.01,0.03,0.05,0,0,0]  # 用于突出显示特定区域

#饼图
plt.pie(x,
        autopct='%.1f%%',#数据标签
        labels=labels,
        startangle=90, #初始角度
        explode=explode, # 突出显示数据
        pctdistance=0.87,  # 设置百分比标签与圆心的距离
        textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值
        counterclock = False, # 是否逆时针
                   )

plt.title("双11各区域销售数占比")
Text(0.5, 1.0, '双11各区域销售数占比')

在这里插入图片描述

三、闯关题

STEP1: 按照要求计算下方题目结果

⛳️闯关题目:电商销售量的折线图展示

假设你是一家电商公司的数据分析师,老板要求你根据最近一个月的销售数据制作一个折线图来展示销售量的趋势。你需要使用pandas来生成模拟数据,并使用matplotlib来完成可视化,并且添加一些图表元素包括标题、轴标题、数据标签、网格线、线型、点型等,这样可以更直观地看到数据趋势。

💡题目提示

  • 使用pandas生成一个月的电商销售量数据。
  • 使用matplotlib制作折线图。
  • 图表需要包含以下基本元素:标题、轴标题、数据标签、网格线、线型和点型。
  • 图表需要清晰地展示出销售量的趋势。

请使用下面的代码生成最近一个月的电商销售量数据,根据此数据做一条销售量趋势折线图。

import pandas as pd  
# 生成日期范围  
date_rng = pd.date_range(start='2023-11-1', end='2023-11-30', freq='D') 

# 创建一个DataFrame  
df = pd.DataFrame(date_rng, columns=['日期'])
df['销量'] = [544, 749, 716, 818, 927, 938,  995, 1161, 997,  1110, 
               1465, 1312, 1400, 1097, 1123,  716, 875,  661,  596, 880,
               969,  709, 993, 1142,  821,  913, 945,  530,  860, 927]
df
日期销量
02023-11-01544
12023-11-02749
22023-11-03716
32023-11-04818
42023-11-05927
52023-11-06938
62023-11-07995
72023-11-081161
82023-11-09997
92023-11-101110
102023-11-111465
112023-11-121312
122023-11-131400
132023-11-141097
142023-11-151123
152023-11-16716
162023-11-17875
172023-11-18661
182023-11-19596
192023-11-20880
202023-11-21969
212023-11-22709
222023-11-23993
232023-11-241142
242023-11-25821
252023-11-26913
262023-11-27945
272023-11-28530
282023-11-29860
292023-11-30927
# 下面这里写入你的代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as psl

# %matplotlib inline
# %config InlineBackend.figure_format = 'svg'
 
date_rng = pd.date_range(start='2023-11-1', end='2023-11-30', freq='D') 

# 创建一个DataFrame  
df = pd.DataFrame(date_rng, columns=['日期'])
df['销量'] = [544, 749, 716, 818, 927, 938,  995, 1161, 997,  1110, 
               1465, 1312, 1400, 1097, 1123,  716, 875,  661,  596, 880,
               969,  709, 993, 1142,  821,  913, 945,  530,  860, 927]

# 绘制折线图  
fig, ax = plt.subplots(figsize=(9, 6), facecolor='white')

ax.plot(
    df['日期'],
    df['销量'],
    color="red",
    linestyle="--",
    linewidth=2,
    marker="o",
    markersize=5,
)
ax.set_facecolor('white')

# plt.figure(figsize=(9,6),facecolor='white')  # 设置图表大小  
# plt.plot(df['日期'], df['销量'], marker='o', linestyle='-', color='r')  # 设置线型和点型  
plt.title('近30天销售量数据趋势', loc = "center")
plt.legend(['销售量'], loc="upper center", title='销售量', title_fontsize=10, frameon=False)

plt.xticks(
    ticks=pd.date_range('20231101',periods=30),
    labels=['{}日'.format(i +1) for i in range(30)],
    rotation=45)  # 设置X坐标轴刻度
    
plt.yticks(
    ticks=np.arange(0, 1700, 100),
    labels=['{}单'.format(i*100) for i in range(17)])  # 设置Y坐标轴刻度
    # labels=['{}单'.format(i) for i in range(0, 1600, 100)]

for x,y in zip(pd.date_range('20231101',periods=30), df['销量'].values):
    plt.text(x,y,str(y), ha = "center", va = "bottom", fontsize = 15)

plt.grid(
    color='red',
    linestyle='--',
    alpha=0.3,
    axis='both',
    visible=True,
)  # 设置网格线为虚线,axis='y'可只对Y轴打开网格线

plt.show()  # 显示图表









在这里插入图片描述

df.plotax.plot 都可以用来绘制图表,但它们有一些重要的区别:

  1. df.plot:

    • 是 Pandas 提供的一个便捷方法,可以直接对 DataFrame 对象调用,用于快速绘制图表。
    • df.plot 创建的是一个新的 matplotlib Figure 和 Axes 对象。
    • 默认情况下,df.plot 不允许太多的自定义,适合快速绘制标准图表。
  2. ax.plot:

    • 是 Matplotlib 提供的方法,需要在一个现有的 Axes 对象上调用,用于精细化控制图表的绘制。
    • ax.plot 允许在同一个 Axes 对象上叠加多个图表。
    • 提供了更多的定制选项,适合复杂的图表和需要多次调整的场景。

在你的具体场景中,使用 ax.plot 可以更好地控制图表的细节,并确保所有的绘图都在同一个图表对象(Axes)上进行,这样可以更方便地进行统一的样式和设置管理。

q1:这一个月的销售量峰值是哪一天?选择正确的选项,并把选项赋值给a1。

  • A:10日
  • B:11日
  • C:12日
  • D:13日
#请根据做出来的图表判断,这一个月的销售量峰值是哪一天?
a1='B'#在=后填入销售量峰值是哪一天,可选项,A:'10日'、B:'11日'、C:'12日'、D:'13日'
a1
'B'

q2:这一个月的销售量峰值单量是多少单?并把结果赋值给a2。

#请根据做出来的图表判断,这一个月的峰值单量是多少?
a2= 1465#在=后填入峰值单量,如1400
a2
1465
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值