python可视化
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("/data/SecondhandHouse_view.csv")
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei'
plt.title("建筑面积与房价分布情况的散点图")
plt.xlabel("建筑面积")
plt.ylabel("总价")
plt.scatter(df['建筑面积'],df['总价'])
plt.show()
matplotlib
import matplotlib.pyplot as plt
1、图表名称
plt.title()
2、处理图像的中文
plt.rcParams["font.sans-serif"] = ["simHei"]
plt.rcParams['font.sans-serif']=['WenQuanYi Zen Hei'] # 显示中文
3、改成中文后负号不显示
plt.rcParams['axes.unicode_minus']=False #显示负号
4、设置x轴y轴名称
plt.xlabel(“x轴”)
设置字体大小
plt.xlabel('x轴',fontsize=12)
设置线条的宽度
plt.plot(x,y,linewidth=5)
5、绘制多个线条
plt.plot()
6、设置刻度
plt.xticks(color='r',fontsize=10)
plt.xticks([0,5,10,15,20,25],(["A","B","中","D","","尾坐标"]),color="r",fontsize=10)
详细 Python 绘图模块 Matplotlib 中 xticks, yticks 对像操作详解及去除图像周围白边及y轴翻转_plt.xticks-CSDN博客
x=[25,50,75,100,125,150,175,200]
plt.xticks(x,["%s平方米"% i for i in x],rotation=45)
比赛第一问
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/SecondhandHouse_view.csv")
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei'
plt.title("二手房建筑面积与房价的关系分析")
plt.xlabel("建筑面积(平米)")
plt.ylabel("总价(万)")
x=[25,50,75,100,125,150,175,200]
plt.xticks(x,["%s平方米"% i for i in x],rotation=45)
plt.scatter(df['建筑面积'],df['总价'])
plt.show()
比赛第二问
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/SecondhandHouse_view.csv")
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei'
plt.title("二手房建筑面积与房价的关系分析")
plt.xlabel("建筑面积(平米)")
plt.ylabel("总价(万)")
def get_count(df):
if df["总价"] <=50:
return 1
if df["总价"] <=65:
return 2
if df["总价"] <=80:
return 3
if df["总价"] <=95:
return 4
if df["总价"] <=110:
return 5
if df["总价"] <=125:
return 6
if df["总价"] <=140:
return 7
if df["总价"] <=155:
return 8
if df["总价"] <=170:
return 9
if df["总价"] > 170:
return 10
df.loc[:,"count"]= df.apply(get_count, axis=1)
price_count = df["count"].value_counts()
x=[1,2,3,4,5,6,7,8,9,10]
plt.xticks(x,["(0,50]","(50,65]","(65,80]","(80,95]","(95,110]","(110,125]","(125,140]","(140,155]","(155,170]","大于170"],rotation=45)
print(price_count.index)
plt.bar(price_count.index,price_count.values)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/SecondhandHouse_view.csv")
# 定义价格范围箱及其标签
price_bins = [0, 50, 65, 80, 95, 110, 125, 140, 155, 170, float('inf')]
price_labels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei'
# 将“总价”分类为定义的级别
df['价格等级'] = pd.cut(df['总价'], bins=price_bins, labels=price_labels, right=False)
# 计算每个价位的房屋数量
price_level_counts = df['价格等级'].value_counts().sort_index()
plt.figure(figsize=(10, 6))
price_level_counts.plot(kind='bar', alpha=0.75)
plt.title('不同房价等级的二手房出售数量分布')
plt.xlabel('房价等级')
plt.ylabel('二手房出售数量')
plt.xticks(rotation=0)
plt.grid(axis='y')
# plt.show()
print(price_level_counts)
比赛第三问
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/SecondhandHouse_view.csv")
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei'
# (3) 按地区对数据进行分组,并计算平均总价和销售额
grouped_data = df.groupby('区域').agg({'总价': 'mean', '建筑面积': 'count'}).rename(columns={'总价': '平均房价', '建筑面积': '出售数量'})
# 按平均总价对分组数据进行排序
grouped_data_sorted = grouped_data.sort_values('平均房价')
# 创建具有双y轴的组合图表
fig, ax1 = plt.subplots(figsize=(12, 7))
# 平均价格条形图
ax1.bar(grouped_data_sorted.index, grouped_data_sorted['平均房价'], color='skyblue', alpha=0.6, label='平均房价(万)')
ax1.set_xlabel('二手房区域')
ax1.set_ylabel('平均房价(万)', color='skyblue')
ax1.tick_params(axis='y', labelcolor='skyblue')
ax1.set_title('不同区域二手房平均房价与出售数量的组合图')
# 次要y轴上的销售额折线图
ax2 = ax1.twinx()
ax2.plot(grouped_data_sorted.index, grouped_data_sorted['出售数量'], color='darkred', marker='o', label='出售数量')
ax2.set_ylabel('出售数量', color='darkred')
ax2.tick_params(axis='y', labelcolor='darkred')
fig.tight_layout()
fig.legend(loc='upper right', bbox_to_anchor=(1, 1), bbox_transform=ax1.transAxes)
plt.show()
plt.rcParams设置画图的分辨率,大小等信息
- plt.rcParams['figure.figsize'] = (8.0, 4.0) # 设置figure_size英寸
- plt.rcParams['figure.dpi'] = 300 #分辨率
- 默认的像素:[6.0,4.0],分辨率为72,图片尺寸为 432x288
- 指定dpi=100,图片尺寸为 600*400
- 指定dpi=300,图片尺寸为 1800*1200
创建图形对象
在 Matplotlib 中,面向对象编程的核心思想是创建图形对象(figure object)。通过图形对象来调用其它的方法和属性,这样有助于我们更好地处理多个画布。在这个过程中,pyplot 负责生成图形对象,并通过该对象来添加一个或多个 axes 对象(即绘图区域)。
Matplotlib 提供了matplotlib.figure
图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。
figure方法如下:
plt.figure(
num=None,------------------------------------> 图像编号或名称,数字为编号 ,字符串为名称
figsize=None,--------------------------------> 指定figure的宽和高,单位为英寸;
dpi=None,------------------------------------> 定绘图对象的分辨率,即每英寸多少个像素,缺省值为72
facecolor=None,------------------------------> 背景颜色
edgecolor=None, -----------------------------> 边框颜色
frameon=True, -------------------------------> 是否显示边框
**kwargs,
)
from matplotlib import pyplot as plt
# 创建图形对象,相当于我们创建一个画布
fig = plt.figure()
# 之前通过配置更改图形的分辨率和宽高. 如今可以再创建图像对象是创建
fig = plt.figure('f1',figsize=(3,2),dpi=100)
# plt.plot()
x = np.arange(0,50)
y = x ** 2
plt.plot(x,y)
fig = plt.figure('f1',figsize=(4,2),dpi=100)
plt.plot()
x = np.arange(0,50)
y = x ** 2
# 创建图形对象, 图形对象的分辨率为100,背景颜色为:灰色
fig = plt.figure('f1',figsize=(4,2), dpi=100,facecolor='gray')
# 获取轴
ax = plt.gca()
ax.plot(x,y)
plt.plot(x,y)
绘制多子图
figure是绘制对象(可理解为一个空白的画布),一个figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。
接下来将学习绘制子图的几种方式:
- add_axes() : 添加区域
- subplot() : 均等地划分画布,只是创建一个包含子图区域的画布,(返回区域对象)
- subplots() : 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象.(返回图形对象和区域对象)
add_axes() : 添加区域
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
2D 绘图区域(axes)包含两个轴(axis)对象
语法:
add_axes(rect)
- 该方法用来生成一个 axes 轴域对象,对象的位置由参数rect决定
- rect 是位置参数,接受一个由 4 个元素组成的浮点数列表,形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。
如下所示:
fig = plt.figure(figsize=(4,2),facecolor='g')
# ax1从画布起始位置绘制,宽高和画布一致
ax1=fig.add_axes([0,0,1,1])
# ax2 从画布 20% 的位置开始绘制, 宽高是画布的 50%
#ax2=fig.add_axes([0.2,0.2,0.5,0.5])
#ax2=fig.add_axes([0.5,0.5,0.5,0.5])
ax2=fig.add_axes([0.1,0.6,0.3,0.3])
ax3=fig.add_axes([0.5,0.6,0.2,0.3])
ax1.plot(x, y)
ax2.plot(x, y)
ax3.plot(x, y)
注意:每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如,[ 0.2,0.2, 0.5, 0.5],它代表着从画布 20% 的位置开始绘制, 宽高是画布的 50%
区域中基本方法的使用
- 区域图表名称: set_title
- 区域中x轴和y轴名称:set_xlabel() set_ylabel()
- 刻度设置: set_xticks()
- 区域图表图例: legend()
# 创建绘图对象
fig = plt.figure(figsize=(4,2),facecolor='g')
# 创建x坐标
x = np.arange(0,50,2)
# 创建y坐标
y = x ** 2
# 创建区域1,和画布位置一致
ax1 = fig.add_axes([0.0,0.0,1,1])
# 设置图表名称
ax1.set_title("axes1")
# x轴名称
ax1.set_xlabel('X axis')
# 设置ax1横轴刻度
ax1.set_xticks(np.arange(0,50,3))
# 区域绘制图形
ax1.plot(x,y,label="ax1")
# 图例
ax1.legend()
# 创建区域ax2 从画布 40% 的位置开始绘制, 宽高是画布的 50%
ax2=fig.add_axes([0.2,0.2,0.4,0.4])
ax2.set_title("axes2")
# 区域2中绘制图形
ax2.plot(x,y,label='ax2')
# 图例,
ax2.legend()
subplot() 函数,它可以均等地划分画布
参数格式如下:
ax = plt.subplot(nrows, ncols, index,*args, **kwargs)
- nrows 行
- ncols 列
- index: 索引
- kwargs: title/xlabel/ylabel 等.....
返回: 区域对象
nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。
例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第3 个位置绘制子图。

如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。
plt.plot([1,2,3])
#现在创建一个子图,它表示一个有1行2列的网格的顶部图。
#因为这个子图将与第一个重叠,所以之前创建的图将被删除
plt.subplot(211)
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))
plt.subplot(212)
plt.plot(np.arange(12)**2)
如果不想覆盖之前的图,需要先创建画布,也就是
# 还可以先设置画布的大小,再通过画布创建区域
fig = plt.figure(figsize=(4,2))
fig.add_subplot(111)
plt.plot(range(20))
fig.add_subplot(221)
plt.plot(range(12))
设置多图的基本信息方式:
在创建的时候直接设置:
- 对于subplot关键词赋值参数的了解,可以将光标移动到subplot方法上,使用快捷键shift+tab查看具体内容
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
plt.subplot(211,title="pic1", xlabel="x axis")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))
plt.subplot(212, title="pic2", xlabel="x axis")
plt.plot(np.arange(12)**2)
发现子图标题重叠,在最后使用
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
#--------------- 第一个区域---------------
plt.subplot(211,title="pic1", xlabel="x axis")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))
#--------------------第二区域-----------
plt.subplot(212, title="pic2", xlabel="x axis")
plt.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()
使用pyplot模块中的方法设置后再绘制
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
#--------------- 第一个区域---------------
plt.subplot(211)
# 使用图形对象:
plt.title("ax1")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))
#--------------------第二区域-----------
plt.subplot(212)
plt.title("ax2")
#...其他的自己设置
plt.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()
.使用返回的区域对象设置.
注意区域对象的方法很多都是set_开头
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
#--------------- 第一个区域 ax1---------------
ax1 = plt.subplot(211)
# 使用区域对象:
ax1.set_title("ax1")
# x可省略,默认[0,1..,N-1]递增
ax1.plot(range(50,70))
#--------------------第二区域 ax2-----------
ax2 = plt.subplot(212)
ax2.set_title("ax2")
#...其他的自己设置
ax2.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()
subplots()函数详解
matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。
subplots 的函数格式如下:
fig , ax = plt.subplots(nrows, ncols)
- nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列
函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)
# 引入模块
import matplotlib.pyplot as plt
import numpy as np
# 创建2行2列的子图,返回图形对象(画布),所有子图的坐标轴
fig, axes = plt.subplots(2,2)
x = np.arange(1,5)
#绘制平方函数
axes[0][0].plot(x, x*x)
axes[0][0].set_title('square')
#绘制平方根图像
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('square root')
#绘制指数函数
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')
#绘制对数函数
axes[1][1].plot(x,np.log10(x))
axes[1][1].set_title('log')
# 处理标题遮挡
plt.tight_layout()
plt.show()
实例
fig,axes = plt.subplots(1,2)
# 设置画布的高和宽, 注意:只为英寸 ,默认分别率为72
fig.set_figheight(3) # 实际高度为 73*3 像素
fig.set_figwidth(8) # 实际宽度为 73*8 像素
# 设置背景:
fig.set_facecolor('gray')
# 分别定义x y
x = np.arange(-50,51)
y = x ** 2
#--------------------绘制图形1 -----------
axes[0].plot(x, y)
# ------------处理图形2的绘制----------------
# 不需要右侧和上侧线条,则可以设置他的颜色
axes[1].spines['right'].set_color("none")
axes[1].spines['top'].set_color("none")
# 移动下轴到指定位置
# 在这里,position位置参数有三种,data , outward(向外-可自行尝试) , axes
# axes:0.0 - 1.0之间的值,整个轴上的比例
axes[1].spines['left'].set_position(('axes',0.5))
# 移动下轴到指定位置
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
axes[1].spines['bottom'].set_position(('data',0.0))
axes[1].plot(x, y)
柱状图
matplotlib.pyplot.bar(x, height, width: float = 0.8, bottom = None, *, align: str = ‘center’, data = None, **kwargs)
- x 表示x坐标,数据类型为float类型,一般为np.arange()生成的固定步长列表
- height 表示柱状图的高度,也就是y坐标值,数据类型为float类型,一般为一个列表,包含生成柱状图的所有y值
- width 表示柱状图的宽度,取值在0~1之间,默认值为0.8
- bottom 柱状图的起始位置,也就是y轴的起始坐标,默认值为None
- align 柱状图的中心位置,“center”,"lege"边缘,默认值为’center’
- color 柱状图颜色,默认为蓝色
- alpha 透明度,取值在0~1之间,默认值为1
- label 标签,设置后需要调用plt.legend()生成
- edgecolor 边框颜色 (ec)
- linewidth 边框宽度,浮点数或类数组,默认为None (lw)
- tick_label:柱子的刻度标签,字符串或字符串列表,默认值为None。
- linestyle :线条样式 (ls)
import matplotlib.pyplot as plt
# x轴数据
x = range(5)
# y轴数据
data = [5, 20, 15, 25, 10]
# 设置图形标题:
plt.title("color参数设置柱状图不同颜色")
# 绘制网格
plt.grid(ls="--", alpha=0.5)
# bar绘制图形,x 表示x坐标 data为表示柱状图的高度
#plt.bar(x, data ,color=['r', 'g', 'b'])
'''
facecolor和color设置单个颜色时使用方式一样
color可以设置多个颜色值,facecolor不可以
'''
plt.bar(x, data ,color=['r', 'g', 'b'])
同位置多柱状图
# 国家
countries = ['挪威', '德国', '中国', '美国', '瑞典']
# 金牌个数
gold_medal = [16, 12, 9, 8, 8]
# 银牌个数
silver_medal = [8, 10, 4, 10, 5]
# 铜牌个数
bronze_medal = [13, 5, 2, 7, 5]
width = 0.2
plt.bar(countries, gold_medal,color="gold", width=width)
plt.bar(countries,silver_medal,color="silver", width=width)

from matplotlib import pyplot as plt
import numpy as np
# 设置基本属性.....
# ........... 省略..........
# 国家
countries = ['挪威', '德国', '中国', '美国', '瑞典']
# 金牌个数
gold_medal = [16, 12, 9, 8, 8]
# 银牌个数
silver_medal = [8, 10, 4, 10, 5]
# 铜牌个数
bronze_medal = [13, 5, 2, 7, 5]
# 1.将x轴转换为数值
x = np.arange(len(countries))
print(x)
# 2.设置图形的宽度
width = 0.2
# ===============确定x起始位置==========
# 金牌起始位置
gold_x = x
# 银牌的起始位置
silver_x = x + width
# 铜牌的起始位置
bronze_x = x + 2 * width
# ==================分别绘制图形
# 金牌图形
plt.bar(gold_x,gold_medal,width=width,color="gold")
# 银牌图形
plt.bar(silver_x,silver_medal,width=width,color="silver")
# 铜牌图形
plt.bar(bronze_x,bronze_medal,width=width, color="saddlebrown")
# ================将x轴的坐标变回来
# 注意x标签的位置未居中
plt.xticks(x+width, label=countries)
#-----------显示高度文本----------------
for i in range(len(countries)):
# 金牌的文本设置
plt.text(gold_x[i],gold_medal[i],gold_medal[i],va="bottom",ha="center")
plt.text(silver_x[i],silver_medal[i],silver_medal[i],va="bottom",ha="center")
plt.text(bronze_x[i],bronze_medal[i],bronze_medal[i],va="bottom",ha="center")

from matplotlib import pyplot as plt
import numpy as np
# 设置基本属性.....
# ........... 省略..........
# 国家
countries = ['挪威', '德国', '中国', '美国', '瑞典']
# 金牌个数
gold_medal = [16, 12, 9, 8, 8]
# 银牌个数
silver_medal = [8, 10, 4, 10, 5]
# 铜牌个数
bronze_medal = [13, 5, 2, 7, 5]
# 1.将x轴转换为数值
x_int = np.arange(len(countries))
# 2.设置图形的宽度
width = 0.2
# 确定x起始位置
gold_x = x_int # 金牌起始位置
silver_x = x_int+width # 银牌的起始位置
bronze_x = x_int + 2*width # 铜牌的起始位置
# 分别绘制图形
plt.bar(gold_x, gold_medal, width=width,color="gold", label="金牌") # 金牌图形
plt.bar(silver_x, silver_medal, width=width, color="silver",label="银牌") # 银牌图形
plt.bar(bronze_x, bronze_medal, width=width, color="saddlebrown",label="铜牌") # 铜牌图形
# 将x轴的坐标变回来
# plt.xticks(x_int,labels=countries)
# 移动x标记的位置,再替换内容
plt.xticks(x_int + width,label=countries)
#-----------显示高度文本----------------
# # 金牌
# for x,y in zip(gold_x,gold_medal):
# plt.text(x,y,y,va="bottom",ha="center",fontsize=8)
# # 银牌牌
# for x,y in zip(silver_x, silver_medal):
# plt.text(x,y,y,va="bottom",ha="center",fontsize=8)
# # 铜牌
# for x,y in zip(bronze_x, bronze_medal):
# plt.text(x,y,y,va="bottom",ha="center",fontsize=8)
# 金牌 # 银牌 # 铜牌
for i in range(len(countries)):
# 金牌
plt.text(gold_x[i],gold_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
# 银牌
plt.text(silver_x[i],silver_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
# 铜牌
plt.text(bronze_x[i],bronze_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
# 显示图例
plt.legend()
下面是一些常见的 set_ 方法列表:
set_xlabel - 设置 x 轴的标签。
set_ylabel - 设置 y 轴的标签。
set_xlim - 设置 x 轴的显示范围。
set_ylim - 设置 y 轴的显示范围。
set_title - 设置图表的标题。
set_xticks - 设置 x 轴的刻度位置。
set_yticks - 设置 y 轴的刻度位置。
set_xticklabels - 设置 x 轴的刻度标签。
set_yticklabels - 设置 y 轴的刻度标签。
set_aspect - 设置坐标轴的纵横比。
set_xscale - 设置 x 轴的缩放方式(如线性、对数等)。
set_yscale - 设置 y 轴的缩放方式。
set_facecolor - 设置坐标轴的背景颜色。
set_frame_on - 设置是否显示坐标轴的框架。
set_xbound - 设置 x 轴的边界。
set_ybound - 设置 y 轴的边界。
set_clip_on - 设置是否剪切超出坐标轴范围的图表元素。
set_clip_box - 设置剪切框。
set_clip_path - 设置自定义剪切路径。
层叠柱状图
countries = ['挪威', '德国', '中国', '美国', '瑞典']
# 金牌个数
gold_medal = np.array([16, 12, 9, 8, 8])
# 银牌个数
silver_medal = np.array([8, 10, 4, 10, 5])
# 铜牌个数
bronze_medal = np.array([13, 5, 2, 7, 5])
# 绘制堆叠图
# 宽度
width = 0.3
# 绘制金牌
plt.bar(countries, gold_medal, color='gold', label='金牌',
bottom=silver_medal + bronze_medal,width=width)
# 绘制银牌
plt.bar(countries, silver_medal, color='silver', label='银牌', bottom=bronze_medal,width=width)
# 绘制铜牌
plt.bar(countries, bronze_medal, color='#A0522D', label='铜牌',width=width)
# 设置坐标轴
plt.ylabel('奖牌数')
# 设置图例
plt.legend(loc='upper right')
# 设置文本值
for i in range(len(countries)):
max_y = bronze_medal[i]+silver_medal[i]+gold_medal[i]
plt.text(countries[i], max_y, max_y, va="bottom", ha="center")水平条形图
水平条形图
调用 Matplotlib 的 barh() 函数可以生成水平柱状图。
- barh() 函数的用法与 bar() 函数的用法基本一样,只是在调用 barh() 函数时使用 y参数传入 Y 轴数据,使用 width 参数传入代表条柱宽度的数据。
plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
countries = ['挪威', '德国', '中国', '美国', '瑞典']
# 金牌个数
gold_medal = np.array([16, 12, 9, 8, 8])
# y轴为国家,宽度为奖牌数
plt.barh(countries, width=gold_medal)
直方图 plt.hist()
直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。
首先,我们需要了解柱状图和直方图的区别。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。

柱状图 | 直方图 |
---|---|
柱状图一般用于描述离散型分类数据的对比 | 直方图一般用于描述连续型数据的分布关系 |
每根柱子宽度固定,柱子之间会有间距 | 每根柱子宽度可以不一样,且一般没有间距 |
横轴变量可以任意排序 | 横轴变量有一定顺序规则 |
将统计值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个类别的占比,其高度总和等于1。
plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
- x: 作直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;必选参数;
- bins: 直方图的柱数,即要分的组数,默认为10;
- weights:与x形状相同的权重数组;将x中的每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图;
- density:布尔,可选。如果"True",返回元组的第一个元素将会将计数标准化以形成一个概率密度,也就是说,直方图下的面积(或积分)总和为1。这是通过将计数除以数字的数量来实现的观察乘以箱子的宽度而不是除以总数数量的观察。如果叠加也是“真实”的,那么柱状图被规范化为1。(替代normed)
- bottom:数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下便宜距离;
- histtype:{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’};'bar’是传统的条形直方图;'barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,只有外边框;‘stepfilled’是有填充的直方图;当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起;
- align:{‘left’, ‘mid’, ‘right’};‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的中心位于bins的右边缘;
- color:具体颜色,数组(元素为颜色)或None。
- label:字符串(序列)或None;有多个数据集时,用label参数做标注区分;
- normed: 是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数;
- edgecolor: 直方图边框颜色;
- alpha: 透明度;
饼状图 pie()
饼状图用来显示一个数据系列,具体来说,饼状图显示一个数据系列中各项目的占项目总和的百分比。
Matplotlib 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:
pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None)
- x: 数组序列,数组元素对应扇形区域的数量大小。
- labels: 列表字符串序列,为每个扇形区域备注一个标签名字。
- colors; 为每个扇形区域设置颜色,默认按照颜色周期自动设置。
- autopct: 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内。
- pctdistance:设置百分比标签与圆心的距离;
- labeldistance:设置各扇形标签(图例)与圆心的距离;
- explode: 指定饼图某些部分的突出显示,即呈现爆炸式;()
- shadow:是否添加饼图的阴影效果
from matplotlib import pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 中文负号
plt.rcParams['axes.unicode_minus'] = False
# 设置分别率 为100
plt.rcParams['figure.dpi'] = 100
# 设置大小
plt.rcParams['figure.figsize'] = (5,3)
#定义饼的标签,
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
explode = (0.03,0.05,0.06,0.04,0.08,0.21)
plt.pie(x,labels=labels,autopct="%.2f%%",pctdistance=0.6,labeldistance=1.6,explode=explode,shadow=True)
plt.axis('equal') # 使图形呈现成正圆
plt.legend(labels, title="Seasons")
plt.show()
import matplotlib.pyplot as plt
# 数据
labels = ['Q1', 'Q2', 'Q3', 'Q4']
sizes_2019 = [20, 30, 35, 15]
sizes_2020 = [25, 35, 25, 15]
# 创建饼图
fig, axs = plt.subplots(1, 2)
axs[0].pie(sizes_2019, labels=labels, autopct='%1.1f%%')
axs[0].set_title('2019 Sales')
axs[0].axis('equal')
axs[1].pie(sizes_2020, labels=labels, autopct='%1.1f%%')
axs[1].set_title('2020 Sales')
axs[1].axis('equal')
plt.show()
设置颜色
import matplotlib.pyplot as plt
# 数据
labels = ['Apple', 'Banana', 'Cherry', 'Date']
sizes = [30, 15, 45, 10]
# 颜色列表
colors = ['red', 'yellow', 'pink', 'brown']
# 创建饼图
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
plt.axis('equal') # 保证饼图是圆的
plt.show()
散点图 scatter()
`matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
- x, y → 散点的坐标
- s → 散点的面积
- c → 散点的颜色(默认值为蓝色,'b',其余颜色同plt.plot( ))
- marker → 散点样式(默认值为实心圆,'o',其余样式同plt.plot( ))
- alpha → 散点透明度([0, 1]之间的数,0表示完全透明,1则表示完全不透明)
- linewidths →散点的边缘线宽
- edgecolors → 散点的边缘颜色
- cmap → Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50) # 颜色值
sizes = 1000 * np.random.rand(50) # 散点面积
# 创建散点图
plt.scatter(x, y, s=sizes, c=colors, alpha=0.5, cmap='viridis', linewidths=2, edgecolors='w')
# 添加颜色条
plt.colorbar() # 显示颜色条
# 设置图表标题和坐标轴标签
plt.title('Customized Scatter Plot')
plt.xlabel('X')
plt.ylabel('Y')
# 显示图表
plt.show()
箱线图绘制boxplot()
`matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, *, data=None)
- x:输入数据。类型为数组或向量序列。必备参数。
- notch:控制箱体中央是否有V型凹槽。当取值为True时,箱体中央有V型凹槽,凹槽表示中位数的置信区间;取值为False时,箱体为矩形。类型为布尔值,默认值为False。可选参数。
- vert:箱体的方向,当取值为True时,绘制垂直箱体,当取值为False时,绘制水平箱体。类型为布尔值,默认值为True。可选参数。
- positions:指定箱体的位置。刻度和极值会自动匹配箱体位置。类型为类数组结构。可选参数。默认值为range(1, N+1) ,N为箱线图的个数。
- widths:箱体的宽度。类型为浮点数或类数组结构。默认值为0.5或0.15*极值间的距离。
- labels:每个数据集的标签,默认值为'None'。类型为序列。可选参数。
- autorange:类型为布尔值,默认值为False。可选参数。当取值为True且数据分布满足上四分位数(75%)和下四分位数(25%)相等
- showmeans:是否显示算术平均值。类型为布尔值,默认值为False。可选参数。
- meanline:均值显示为线还是点。类型为布尔值,默认值为False。可选参数。当取值为True,且showmeans、shownotches参数均为True,时显示为线
- capprops:箱须横杠的样式。类型为字典,默认值为None。可选参数。
- boxprops:箱体的样式。类型为字典,默认值为None。可选参数。
- whiskerprops:箱须的样式。类型为字典,默认值为None。可选参数。
- flierprops:离群点的样式。类型为字典,默认值为None。可选参数。
- medianprops:中位数的样式。类型为字典,默认值为None。可选参数。
- meanprops:算术平均值的样式。类型为字典,默认值为None。可选参数。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
data1 = np.random.normal(100, 10, 200)
data2 = np.random.normal(90, 20, 200)
data3 = np.random.normal(80, 30, 200)
data = [data1, data2, data3]
# 创建箱线图
fig, ax = plt.subplots()
boxprops = dict(linestyle='-', linewidth=2, color='k')
medianprops = dict(linestyle='-', linewidth=2, color='firebrick')
meanprops = dict(linestyle='--', linewidth=2, color='blue')
# box = {"linestyle":'--',"linewidth":1,"color":'blue'}
# 生成箱线图
bp = ax.boxplot(data, notch=True, vert=True, widths=0.4, showmeans=True, meanline=True,
boxprops=boxprops, medianprops=medianprops, meanprops=meanprops,
labels=['Group 1', 'Group 2', 'Group 3'])
# 设置图表标题和坐标轴标签
ax.set_title('Comparison of Three Groups')
ax.set_ylabel('Values')
ax.set_xlabel('Group')
# 显示图表
plt.show()
词云图
自定义词云图
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = "Python is a great programming language. It is used for data science, web development, automation, and many more areas."
# 创建词云对象,设置背景颜色和最大单词数
wordcloud = WordCloud(background_color='white', max_words=50, width=800, height=400).generate(text)
# 显示词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
使用自定义形状和颜色
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
text = "Python is a great programming language. It is used for data science, web development, automation, and many more areas."
mask = np.array(Image.open("cloud.png")) # 确保路径正确
# 创建带有特定背景形状的词云
wordcloud = WordCloud(background_color='white', mask=mask).generate(text)
# 从图片本身生成颜色
image_colors = ImageColorGenerator(mask)
# 显示词云图
plt.figure(figsize=(8, 8))
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
plt.axis("off")
plt.show()
jieba分词
import jieba
seg_list = jieba.cut("我来到北京清华大学") # 默认是精确模式
print(" ".join(seg_list))
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + " ".join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + " ".join(seg_list)) # 精确模式
seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 默认是精确模式
print(" ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(" ".join(seg_list))
我 来到 北京 清华大学
Full Mode: 我 来到 北京 清华 清华大学 华大 大学
Default Mode: 我 来到 北京 清华大学
小明 硕士 毕业 于 中国科学院 计算所 , 后 在 日本京都大学 深造
小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 , 后 在 日本 京都 大学 日本京都大学 深造
jieba.analyse的使用:提取关键字
- 第一个参数:待提取关键词的文本
- 第二个参数 topK:返回关键词的数量,重要性从高到低排序
- 第三个参数 withWeight:是否同时返回每个关键词的权重
- 第四个参数allowPOS=():词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词 ,查看:jieba词性表.txt
import jieba
# 必须引入的使用就引入jieba.analyse,才能使用. 不能导入jieba ,然后使用jieba.analyse
import jieba.analyse
text = " 因此电影开头谜语人从用地毯铲杀市长开始就在为验证蝙蝠侠的身份布局了"
seg_list = jieba.cut(text, cut_all=True)
print("Full Mode: " + " ".join(seg_list)) # 全模式
seg_list = jieba.cut(text, cut_all=False)
print("Default Mode: " + " ".join(seg_list)) # 精确模式
# 提取关键字
seg_list = jieba.analyse.extract_tags(text)
print("analysea extract: " + " ".join(seg_list)) # 分析提取
# 提取5个
seg_list = jieba.analyse.extract_tags(text, topK=5)
print("analysea extract topK: " + " ".join(seg_list)) # 分析提取
# 返回权重
seg_list = jieba.analyse.extract_tags(text, topK=5, withWeight=True)
print("analysea extract withWeight: " + str((seg_list))) # 分析提取
# 词性过滤 返回 n名词
seg_list = jieba.analyse.extract_tags(text, allowPOS=("n"))
print("analysea extract allowPOS: " + str((seg_list))) # 分析提取
seaborn
十分钟掌握Seaborn,进阶Python数据可视化分析 - 知乎 (zhihu.com)
题目
简单箱线图
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
df = pd.read_csv(r"F:\study\比赛\大数据比赛\第三部分\data.csv")
df = df.dropna()
df = df.drop_duplicates()
plt.figure(figsize=(6,6))
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
ax=plt.gca() #ax为两条坐标轴的实例
y_major_locator=MultipleLocator(5000)#把y轴的刻度间隔设置为10,并存在变量里
ax.yaxis.set_major_locator(y_major_locator)#把y轴的主刻度设置为1的倍数
plt.boxplot(df["单价"],medianprops={'color':'red'},labels = ["单价"])
plt.ylabel("单价(元/平米)")
plt.title("房屋单价箱线图")
plt.grid()
plt.show()
区域单价箱线图
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
df = pd.read_csv(r"F:\study\比赛\大数据比赛\第三部分\data.csv")
df = df.dropna()
df = df.drop_duplicates()
plt.figure(figsize=(10,50))
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
# df_house_mean = df.groupby('区域')['单价']
groups = df.groupby('区域')
newgroups=groups.agg({'单价':'mean'}).sort_values('单价',ascending=False)#按照单价均值排序
range_price=[]
for r in newgroups.index:#为了绘制箱线图,获取每个区域的单价数据
range_price.append(df[df.区域==r].单价)
print(range_price)
plt.boxplot(range_price,labels=newgroups.index)
plt.xlabel("区域名称")
plt.ylabel("单价(元/平米)")
plt.grid(axis='y')
plt.title("各区域单价箱线图")
plt.show()
词
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 读取语料数据文件
text = open(r"F:\study\比赛\大数据比赛\第三部分\data.csv", "r",encoding="utf-8").read()
wc = WordCloud(font_path="吉祥宋.ttf", background_color="white", contour_width=3, contour_color="steelblue")
# 生成词云
wc.generate(text)
# 存储到文件
wc.to_file("cloud.png")
# 展示词云结果
plt.imshow(wc)
plt.axis("off")
plt.show()
自定义词云图案
# 生成词云
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
text = open('data.csv', "r",encoding="utf-8").read()# 读取语料数据文件
background_img = plt.imread("bg.jpg")# 读取背景图
wc = WordCloud(font_path="吉祥宋.ttf", background_color="white", mask=background_img)#mask属性就是我们的图
wc.generate(text)# 生成词云,这时候颜色和我们图片是不一样的
image_color = ImageColorGenerator(background_img) # 从背景图片生成颜色值
wc.recolor(color_func=image_color)#对生成的图重新着色
wc.to_file("cloud.png")# 存储到文件
plt.imshow(wc)# 展示词云结果
plt.axis("off")
plt.show()
各个区域房源数据统计
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("D:\\桌面\\daima-dsj\\data(1).csv") #读进来是一个二维表格结构 DataFrame
df =df.dropna()
df =df.drop_duplicates()
counts = df.groupby(by="区域").count() #统计
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
plt.title("各个区域的房源数量分析")
plt.bar(counts.index,counts["标题"],label="数量")
plt.xticks(rotation=45)
plt.ylabel("数量")
plt.legend()
for a,b in zip(counts.index, counts["标题"]) :
plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="red")
plt.show()
朝向
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("data.csv") #读进来是一个二维表格结构 DataFrame
df =df.dropna()
df =df.drop_duplicates()
counts = df.groupby(by="朝向").count() #统计
print(counts)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
plt.title("朝向统计")
plt.bar(counts.index,counts["标题"],label="数量")
plt.xticks(rotation=90)
plt.ylabel("数量")
plt.legend()
for a,b in zip(counts.index, counts["标题"]) :
plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="red")
plt.show()
户型
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("D:\\桌面\\daima-dsj\\data(1).csv") #读进来是一个二维表格结构 DataFrame
df =df.dropna()
df =df.drop_duplicates()
counts = df.groupby(by="户型").count() #统计
plt.figure(facecolor='pink')
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
plt.title("各种户型数量分析")
plt.plot(counts.index,counts["标题"],label="数量")
plt.xticks(rotation=45)
plt.ylabel("数量")
plt.legend()
for a,b in zip(counts.index, counts["标题"]) :
plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="green")
plt.show()
双图共轴
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(r"F:\study\比赛\大数据比赛\第三部分\data.csv")
df = df.dropna()
df = df.drop_duplicates()
counts = df["单价"].groupby(df["区域"]).median() # 统计
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(counts.index, counts.values, label="平均单价(元/平米)",color="#b3c6ff")
ax2 = ax.twinx()
counts = df["总价"].groupby(df["区域"]).median() # 统计
ax2.plot(counts.index, counts.values, label="总价(万)",color="red")
fig.legend(loc=1, bbox_to_anchor=(1,1), bbox_transform=ax.transAxes) #防止图例变形
plt.show()
面积饼图
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv(r"F:\study\比赛\大数据比赛\第三部分\data.csv")
df = df.dropna()
df = df.drop_duplicates()
df.isnull().any()
divide = [0, 30, 50, 70, 90, 120, 140, 160, 1200]
cut = pd.cut(list(df["面积"]), divide)
data = cut.describe()
print(cut)
print(data.columns)
print(data.counts,data.freqs)
plt.pie(x=data.freqs, explode=(4, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1),
labels=data.index, autopct="%1.2f%%",
startangle=45, radius=1)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
plt.legend(loc='best')
plt.title("面积占比分析")
plt.show()
层叠柱形图
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(r"F:\study\比赛\大数据比赛\历史资料\2021年大数据与人工智能竞赛赛题\高职B\数据\AppSalse.csv")
groupData = df.groupby(["age_group", "customer_type"]).agg({"salse": "sum"}).unstack(fill_value=0)
groupData.columns = groupData.columns.droplevel(0)
# plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.figsize"] = (10, 8)
plt.rcParams["figure.dpi"] = 100
x = list(groupData.index)
y1 = groupData["1类"]
y2 = groupData["2类"]
y3 = groupData["3类"]
plt.bar(x, y1)
plt.bar(x, y2, bottom=y1)
plt.bar(x, y3, bottom=(y1 + y2))
plt.tight_layout()
双轴折线图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
df = pd.read_csv("/data/AppSalse.csv")
grouopData = df.groupby(df["age_group"]).agg({"previous_order_amount":"sum","customer_id":"count"})
x = list(grouopData.index)
poaY = list(grouopData.previous_order_amount/10000)
idCnt = list(grouopData.customer_id)
fig,ax = plt.subplots(figsize=(10,8),dpi=100)
ax.plot(x,poaY,color="red",marker="o")
ax2 = ax.twinx()
ax2.plot(x,idCnt)
散点图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
df = pd.read_csv("/data/AppSalse.csv")
groupData = df.groupby(df["customer_age"]).agg({"salse":"sum","customer_id":"count"})
x = list(groupData.customer_id)
y = list(groupData.salse)
plt.scatter(x,y)
同位置多柱状图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
df = pd.read_csv("/data/AppSalse.csv")
grouopData = df.groupby(df["age_group"]).agg({"salse":"mean","previous_order_amount":"mean"}).sort_values(by="previous_order_amount",ascending=False)
x = list(grouopData.index)
salseY = list(grouopData.salse)
proY = list(grouopData.previous_order_amount)
width =0.2
x = np.arange(len(x))
plt.bar(x,salseY,width=width)
plt.bar(x+0.2,proY,width=width)
plt.xticks(x+0.1,["20- ","40-49","50-59","90-99","60-69","20-39","70-79","30-39","80-89"])
plt.show()
饼状图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
df = pd.read_csv("/data/AppSalse.csv")
groupData = df.groupby(df["customer_type"]).agg({"customer_id":"count","salse":"sum"})
promote_last_30 = df[df["promote_last_30"] == 1]
groupActiveData = promote_last_30.groupby(promote_last_30["customer_type"]).agg({"customer_id":"count"})
xCnt = groupData.customer_id
xSal = groupData.salse
xActCnt = groupActiveData.customer_id
plt.subplot(131)
plt.pie(xCnt,labels=["1类","2类","3类"], autopct='%1.1f%%')
plt.subplot(132)
plt.pie(xSal,labels=["1类","2类","3类"], autopct='%1.1f%%')
plt.subplot(133)
plt.pie(xActCnt,labels=["1类","2类","3类"], autopct='%1.1f%%')
双轴折线图
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/music.csv" ,sep="&&" ,engine="python")
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.dpi"] = 100
plt.rcParams["figure.figsize"] = (10,8)
df["order_day"] = pd.to_datetime(df["order_day"],format="%Y%m%d")
groupMonth = df.groupby(df["order_day"].dt.month).agg({"paymoney":"sum","musics":"count"}).rename(columns={"paymoney":"消费金额求和","musics":"消费数量求和"})
fig,ax = plt.subplots()
paySumX = list(groupMonth.index)
paySumY = list((groupMonth.消费金额求和)/10000)
ax.set_ylabel("消费金额求和(万元)")
ax.set_xlabel("月份")
ax.plot(paySumX,paySumY,label="消费金额求和(万元)")
ax2 = ax.twinx()
musCntX = list(groupMonth.index)
musCntY = list(groupMonth.消费数量求和)
ax2.set_ylabel("消费数量求和")
ax2.plot(musCntX,musCntY,color="r",label="消费数量求和")
fig.legend( bbox_to_anchor=(1, 1), bbox_transform=ax.transAxes)
fig.tight_layout()
散点图
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/music.csv" ,sep="&&" ,engine="python")
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.dpi"] = 100
plt.rcParams["figure.figsize"] = (10,8)
groupId = df.groupby(df["user_id"]).agg({"paymoney":"sum","musics":"sum"})
x = list(groupId.musics)
y = list(groupId.paymoney)
plt.scatter(x,y)
直方图
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/music.csv" ,sep="&&" ,engine="python")
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.dpi"] = 100
plt.rcParams["figure.figsize"] = (10,8)
groupId = df.groupby(df["user_id"]).agg({"paymoney":"sum","musics":"sum"})
clearPay = groupId[groupId["paymoney"]<2000]
clearMusic = groupId[groupId["musics"]<100]
plt.subplot(121)
plt.hist(clearPay.paymoney)
plt.subplot(122)
plt.hist(clearMusic.musics)
上下折线图
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("/data/music.csv" ,sep="&&" ,engine="python")
plt.rcParams["font.sans-serif"] = ["WenQuanYi Zen Hei"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["figure.dpi"] = 100
plt.rcParams["figure.figsize"] = (10,8)
df["order_day"] = pd.to_datetime(df["order_day"],format="%Y%m%d")
groupIdMin = df.groupby(df["user_id"]).min().order_day.value_counts().sort_index()
groupIdMax = df.groupby(df["user_id"]).max().order_day.value_counts().sort_index()
plt.subplot(211)
plt.plot(groupIdMin.index,groupIdMin.values)
plt.subplot(212)
plt.plot(groupIdMax.index,groupIdMax.values)
雷达图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
radians = np.linspace(0,2*np.pi,6)
radians = np.concatenate((radians,[radians[0]]))
# A同学: '数学','英语','线代','爬虫','数据可视化','吃喝玩乐' ---> 11,88,66,62,98,100
score_a = np.array([11,88,66,62,98,100])
score_a = np.concatenate((score_a, [score_a[0]]))
# B同学:'数学','英语','线代','爬虫','数据可视化','吃喝玩乐' ---> 91,88,53,22,38,26
score_b = np.array([91,88,53,22,38,26])
score_b = np.concatenate((score_b, [score_b[0]]))
# C同学:'数学','英语','线代','爬虫','数据可视化','吃喝玩乐' ---> 81,98,85,76,88,66
score_c = np.array([81,98,85,76,88,66])
score_c = np.concatenate((score_c, [score_c[0]]))
# 绘制多边形(雷达图)
plt.polar(radians, score_a, radians, score_b, radians, score_c)
# 设置维度标签
radar_labels = ['数学','英语','线代','爬虫','数据可视化','吃喝玩乐']
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
# 设置极坐标的标签
angles = radians * 180/np.pi
plt.thetagrids(angles, labels=radar_labels)
# 填充多边形
tables = plt.fill(radians,score_a,radians,score_b,radians,score_c,alpha=0.25)
plt.show()