参考资料:活用pandas库
# 导入库
import pandas as pd
import matplotlib.pyplot as plt
# 导入数据
anscombe=pd.read_csv(r"...\seaborn常用数据案例\anscombe.csv")
anscombe.head()
大多数基本图表的名字以plt.plot开头。
# 创建数据子集
# 只包含数据集Ⅰ
dataset_1=anscombe[anscombe['dataset']=='I']
plt.plot(dataset_1.x,dataset_1.y)
默认情况下,plt.plot用于画线。如果想用它画圆点,可以给plt.plot传递一个“o”参数。
# 绘制点图
plt.plot(dataset_1.x,dataset_1.y,"o")
当然,也可以对anscombe数据集的其余数据重复该过程。matplotlib可以指定最终图的维数,根据指定的维数放入更小的子图表。通过这种方式,可以在单幅图中显示结果,而不必分成多幅图。
subplot方法有3个参数:子图的行数、子图的列数、子图的位置。子图的位置是按顺序编号的,先从左到右,在从上到下。示例如下
# 创建画布,用于放置子图
fig=plt.figure()
# 指定子图的排布方式
# 本例,子图共有2行,每行2幅子图
# 子图有2行2列,位置是1
axes1=fig.add_subplot(2,2,1)
# 子图有2行2列,位置是2
axes2=fig.add_subplot(2,2,2)
# 子图有2行2列,位置是3
axes3=fig.add_subplot(2,2,3)
# 子图有2行2列,位置是4
axes4=fig.add_subplot(2,2,4)
用上述方法绘制anscombe数据集的4个子图:
# 创建anscombe数据的其余数据集
dataset_2=anscombe[anscombe["dataset"]=="II"]
dataset_3=anscombe[anscombe["dataset"]=="III"]
dataset_4=anscombe[anscombe["dataset"]=="IV"]
# 在上面建立的4个空的轴域中绘制点图
axes1.plot(dataset_1.x,dataset_1.y,"o")
axes2.plot(dataset_2.x,dataset_2.y,"o")
axes3.plot(dataset_3.x,dataset_3.y,"o")
axes4.plot(dataset_4.x,dataset_4.y,"o")
最后,向各个子图添加标签,并使用tight_layout方法确保各个坐标轴彼此分开。
# 向各幅子图添加子标题
axes1.set_title("dataset_1")
axes2.set_title("dataset_2")
axes3.set_title("dataset_3")
axes4.set_title("dataset_4")
# 为整幅图田间一个大标题
fig.suptitle('Anscombe Data')
# 使用紧凑布局
fig.tight_layout()
anscombe数据可视化阐明了为什么只看汇总统计值会产生误导。当把这些点可视化后,即使每个数据集有相同的汇总统计值,不同数据集的点之间的关系也相差较大。
为了让anscombe数据图更完整,可以使用set_xlabel()和set_ylabel()向每个子图添加x轴标签和y轴标签。
在python有关绘图的内容中,注意区分“axis”(坐标轴)和“axes”(轴域)的区别。
1、使用matplotlib绘制统计图
# 导入库
import pandas as pd
import matplotlib.pyplot as plt
tips=pd.read_csv(r"...\seaborn常用数据案例\tips.csv")
print(tips.head())
(1)直方图是通过观察单个变量最常用的方法。这些值是经过“装箱”(bin)处理的,这意味着将它们分组后绘制成图来显示变量的分布情况。
fig=plt.figure()
axes1=fig.add_subplot(1,1,1)
axes1.hist(tips["total_bill"],bins=10)
axes1.set_title("Histogram of Total Bill")
axes1.set_xlabel("Frequency")
axes1.set_ylabel("Total Bill")
fig.show()
(2)散点图用于表示一个连续变量随另一个连续变量的变化所呈现的大致趋势。
scatter_plot=plt.figure()
axes1=scatter_plot.add_subplot(1,1,1)
axes1.scatter(tips['total_bill'],tips['tip'])
axes1.set_title("Scatterplot of Total Bill vs Tip")
axes1.set_xlabel("Total Bill")
axes1.set_ylabel("Tip")
scatter_plot.show()
(3)箱线图用于展示一个离散变量随连续变量的变化而呈现的分布状况。
box_plot=plt.figure()
axes1=box_plot.add_subplot(1,1,1)
axes1.boxplot(
# 箱线图的第一个参数是数据
# 由于要绘制多块数据,因此必须把每块数据放入列表中
[
tips[tips['sex']=='Female']['tip'],
tips[tips['sex']=='Male']['tip']
],
# 然后可以传入一个可选的标签参数,用来标记传递的数据
labels=['Female','Male']
)
axes1.set_title("Boxplot of Tips by Sex")
axes1.set_xlabel('Sex')
axes1.set_ylabel('Tip')
boxplot.show()
(4)如果想要表示更多变量则可以通过颜色或大小来区分。
# 基于性别创建一个带颜色的变量
def recode_sex(sex):
if sex=="Female":
return 0
else:
return 1
tips['sex_color']=tips['sex'].apply(recode_sex)
scatter_plot=plt.figure()
axes1=scatter_plot.add_subplot(1,1,1)
axes1.scatter(
x=tips['total_bill'],
y=tips['tip'],
# 根据聚餐人数设置点的大小,乘以10以放大不同
s=tips['size']*10,
# 为sex设置颜色
c=tips['sex_color'],
# 设置alpha值,增加透明度,以表现重叠的点
alpha=0.5
)
axes1.set_title("Total Bill vs Tip Colored by Sex and Sized by Size")
axes1.set_xlabel("Total Bill")
axes1.set_ylabel("Tip")
scatter_plot.show()