总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o)
原作者:作者:大话数据分析,知乎、公众号【大话数据分析】主理人,5年数据分析经验,前蚂蚁金服数据运营,现京东经营分析师。
原活动链接
目录
- 第一节 Matplotlib基础图表
- 一、Matplotlib基础知识
- 1.Matplotlib导入
- 2.折线图绘制示例
- ⏳跟练题目1
- 3.基本图表设置
- ⏳跟练题目2
- 4.共轴坐标轴
- 4.1共Y坐标轴
- 4.2共X坐标轴
- 5.综合案例
- 二、Matplotlib基础图表
- 1.图表选择
- 2.折线图
- 3.柱形图
- ⏳跟练题目3
- 4.条形图
- 5.饼图
- 三、闯关题
- STEP1: 按照要求计算下方题目结果
第一节 Matplotlib基础图表
本节聚焦matplotlib基础知识和基本图表,你将掌握数据可视化的基础和实践技能,通过学习安装、配置和个性化设置,确保图表的专业性和易读性。并且,学会根据数据类型选择折线图、柱状图、散点图或饼图来展示和分析数据,提升数据驱动的决策能力,在经管领域有更多的实践应用。
一、Matplotlib基础知识
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天的累计业务量达成情况,如下所示,但是整体图表缺少图表标题、坐标轴标题、图例这些元素,受众中无法理解你所表达数据的含义,你需要在该图表中添加图表标题、坐标轴标题、图例。
💡 提示:使用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 0x1abb08449a0>
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()设置网格线,做出来的图表应与下面的图表类似
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 0x1abb4a4b3d0>
<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 0x1abb3d19c70>
<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.图表选择
选择合适的图表类型对于有效地传达数据信息非常重要。在选取图表时需要考虑你想要传达的信息、数据的性质和数量,以及你的受众情况,根据这些因素来选择最能有效地传达你的信息的图表类型。以下是一些常见的图表类型可供选择:
- 比较数据:当你需要比较不同类别或不同时间点的数据时,条形图和饼图是很好的选择。条形图可以用来比较不同类别的数据,而饼图则可以用于展示部分与整体的关系。
- 趋势分析:如果你想展示数据的趋势,例如随时间的变化,线形图或柱状图是很好的选择。线形图适用于时间序列数据,而柱状图则在类别数据上效果更好。
- 部分与整体的关系:饼图或堆叠条形图可以用来展示部分与整体的关系。饼图适用于简单的比例关系,而堆叠条形图可以用于显示不同类别的累积效应。
- 相关性分析:如果你想展示两个变量之间的关系,散点图是好的选择。通过散点图,你可以观察到两个变量之间的趋势和关联。
- 时间序列数据:如果你正在处理时间序列数据,例如温度随时间的变化,那么线形图或者柱状图(如果时间被解释为类别)可能都会很有效。
- 多变量数据:如果你有多维度的数据需要展示,例如多个产品在不同地区和时间的销售情况,可能需要使用更复杂的图表类型,如热力图、小提琴图等。
图表建议思维指南
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()可添加数据标签,做出来的图表应与下面的图表类似
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 0x1abb4d34f40>
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
日期 | 销量 | |
---|---|---|
0 | 2023-11-01 | 544 |
1 | 2023-11-02 | 749 |
2 | 2023-11-03 | 716 |
3 | 2023-11-04 | 818 |
4 | 2023-11-05 | 927 |
5 | 2023-11-06 | 938 |
6 | 2023-11-07 | 995 |
7 | 2023-11-08 | 1161 |
8 | 2023-11-09 | 997 |
9 | 2023-11-10 | 1110 |
10 | 2023-11-11 | 1465 |
11 | 2023-11-12 | 1312 |
12 | 2023-11-13 | 1400 |
13 | 2023-11-14 | 1097 |
14 | 2023-11-15 | 1123 |
15 | 2023-11-16 | 716 |
16 | 2023-11-17 | 875 |
17 | 2023-11-18 | 661 |
18 | 2023-11-19 | 596 |
19 | 2023-11-20 | 880 |
20 | 2023-11-21 | 969 |
21 | 2023-11-22 | 709 |
22 | 2023-11-23 | 993 |
23 | 2023-11-24 | 1142 |
24 | 2023-11-25 | 821 |
25 | 2023-11-26 | 913 |
26 | 2023-11-27 | 945 |
27 | 2023-11-28 | 530 |
28 | 2023-11-29 | 860 |
29 | 2023-11-30 | 927 |
# 下面这里写入你的代码
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.plot
和 ax.plot
都可以用来绘制图表,但它们有一些重要的区别:
-
df.plot
:- 是 Pandas 提供的一个便捷方法,可以直接对 DataFrame 对象调用,用于快速绘制图表。
df.plot
创建的是一个新的 matplotlib Figure 和 Axes 对象。- 默认情况下,
df.plot
不允许太多的自定义,适合快速绘制标准图表。
-
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