Python数据可视化整理



1.配置问题


字体乱码问题:

找到文件夹’\Users\用户名\.matplotlib’,打开fontList.json,查找中文字体如simHei,song,kai等,分别对应简体黑、宋体、楷体等,其对应的name字段值即为我们接下来将要设置的中文字体名,复制下来,代码首行插入:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Heiti TC']    # 指定默认字体:解决plot不能显示中文问题
plt.rcParams['axes.unicode_minus'] = False           # 解决保存图像是负号'-'显示为方块的问题


2. 简单绘图


导入pyplot和numpy模块:

import matplotlib.pyplot as plt 
import numpy as np

绘制出 − π - π π π π π之间的正弦和余弦曲线:

X = np.arange(-np.pi, np.pi, 0.05)  # 创建一个等差数列
C,S = np.cos(X),np.sin(X)
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")
plt.xlabel("弧度")
plt.ylabel("正弦值或余弦值")
plt.title("正弦波和余弦波")
 
plt.savefig('./test.jpg')   #注意,savefig要放在plt.show()的前面,否则可能保存的图片是空白
plt.show()

结果:



3.使用面向对象方式绘图


虽然直接使用matplotlib.pyplot模块很容易快速绘图,但建议使用面向对象的方法,它可以更好地控制和自定义绘图,也拥有更丰富强大的功能,主要思想是创建figure对象和axes对象,然后只调用这两个对象的方法或属性来绘图。


fig_map

4.Figure类和Axes类


语法

首先要创建画布,就是创建figure对象,Figure类是所有元素的顶级容器。通过从pyplot模块调用figure()函数进行实例化:

fig = plt.figure(figsize=(12,9),dpi= 200)   # figsize:指定figure的宽和高;dpi:指定每英寸多少个像素

接下来创建Axes对象,这是后续要继续创建各个元素的顶级容器,参数为列表[左位置,底位置,宽占比,高占比],一般取[0.1, 0.1, 0.8, 0.8]

ax = fig.add_axes([0.1,0.1,0.8,0.8])

实例

y = [1, 4, 9, 16, 25,36,49, 64]
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
fig = plt.figure(figsize=[12,9], dpi=200)      # 创建Figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8])    # 基于fig对象调用add_axes方法创建Axes对象,参数为列表[左位置,底位置,宽占比,高占比]
l1 = ax.plot(x1,y,color='y',marker='s', linestyle='-', linewidth=2)   
l2 = ax.plot(x2,y,color='g',marker='o', linestyle='--', linewidth=2)   
ax.legend(labels = ['电视','智能手机'], loc = 'best', fontsize=15)    # 添加图例,loc参数指定位置(best自动最优位置)
ax.grid(True)		# 网格开启
ax.set_title('广告对销售的影响', fontsize=25)
ax.xaxis.set_tick_params(labelsize=15)	# 设置x轴数字大小
ax.yaxis.set_tick_params(labelsize=15)
ax.set_xlabel('媒介', fontsize=20)
ax.set_ylabel('销售', fontsize=20)
plt.show()

结果:

image-20210514002638045


5.subplots()函数创建多子图


语法

fig,ax = plt.subplots(nrows, ncols)

函数plt.subplots()返回一个图形对象Figure类型和一个包含等于nrows * ncolsaxes轴对象的NumPy array类型,每个轴对象都可通过索引访问。


实例

fig,ax = plt.subplots(2,2)
 
x = np.arange(1,20)
ax[0][0].plot(x,x**2)
ax[0][0].set_title('平方')
ax[0][1].plot(x,np.sqrt(x))
ax[0][1].set_title('平方根')
ax[1][0].plot(x,np.exp(x))
ax[1][0].set_title('指数')
ax[1][1].plot(x,np.log10(x))
ax[1][1].set_title('对数')
 
plt.show()

结果:



6.轴刻度限制


语法

通过set_xlim(start, stop)set_ylim(start,stop)函数设置轴刻度限制,例如:

ax.set_ylim(0,10000)


7.双轴设置


语法

当在同一个图中绘制具有不同单位的多个曲线时,Matplotlib通过twinx()twiny()函数支持此功能


实例

fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
x = np.arange(1,10)
ax1.plot(x,np.exp(x))
ax1.set_ylabel('exp')
ax2 = ax1.twinx()   #twinx()是最常用的,在原轴图的基础上绘制双y轴图
ax2.plot(x,np.log(x),'r')
ax2.set_ylabel('log')
fig.legend(labels = ['exp','log'],loc = 'best')
plt.show()

结果:



8.条形图


语法

ax.bar(x, height, width, bottom, align)

其中必选参数为x(x轴数值或标签组成的序列)和height(y轴数值组成的序列)


实例

fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
x = ['C','C++','Python','Java','PHP']
students = list()
for i in range(5):
	students.append(random.randint(0,50))ax.bar(x,students) plt.show()

结果:


对普通条形图进行一下优化

fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
x = ['C', 'C++', 'Python', 'Java', 'PHP']
students = list()
for i in range(5):
    students.append(random.randint(0, 50))
 
ax.bar(x,
       students,
       alpha=0.5,    # 透明度
       edgecolor='red'  # 边框颜色
)
 
for a, b, label in zip(x, students,students):   #内置函数zip():将几个列表合并为二维列表并转置,返回一个特殊对象,可通过list()列表化之后查看
    plt.text(a, b, label, horizontalalignment = 'center', fontsize = 10)   #plt.text()函数:在图中(a,b)位置添加一个文字标签label; horizontalalignment水平位置取中间;fontsize字体大小
ax.set_xlabel('专业')
ax.set_ylabel('学生人数')
ax.set_title('不同专业学生分布统计')
 
plt.show()

结果:



并列条形图(通过平移每个x值做两次bar图实现)实例

fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
x_tags = ['C','C++','Python','Java','PHP']
x = list(np.arange(5))
 
total_width, n = 0.8, 2
width = total_width / n
 
students = list()
for i in range(10):
    students.append(random.randint(0,50))
students = np.array(students)
students = students.reshape(2,5)    #这几步借用随机数和ndarray对象改变数组结构来灵活生成想要的2行5列随机序列
 
ax.bar(x, students[0], color = 'r', width = width)
for i in range(len(x)):
    x[i] = x[i] + width
ax.bar(x, students[1], color = 'b', width = width,tick_label = x_tags)  #tick_label参数给该bar图的x轴加上标签
ax.legend(labels=['女', '男'])
 
plt.show()

结果:



堆积条形图(通过bar()的bottom参数二次作图基底设为第一次的高度来实现)示例

N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
ind = np.arange(N) # the x locations for the groups
width = 0.35
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
ax.bar(ind, menMeans, width, color='r')
ax.bar(ind, womenMeans, width,bottom=menMeans, color='b')
ax.set_ylabel('分数')
ax.set_title('按组和性别分数')
ax.legend(labels=['男', '女'])

plt.show()

结果:



9.饼图


语法

matplotlib.pyplot.pie( x, explode=None, labels=None, colors=None, autopct=None, shadow=False, labeldistance=1.1)

实例

fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
x_tags = ['C','C++','Python','Java','PHP']
students = [23,17,35,29,12]
explode = (0, 0, 0.1, 0, 0)    # 爆炸主要用来在某几块占比太小文字重叠时使用,这里表示只爆炸第二块饼,爆炸距离是半径的0.1。
 
ax.axis('equal') # 等价于 ax.set(aspect='euqal'),使得饼图在figure窗口放大缩小的过程中,保持圆形不变。
ax.pie(students,labels = x_tags, explode=explode,autopct='%.1f%%',shadow=True)   #autopct显示每块饼的百分比属性且自定义小数点位数
 
plt.show()

结果:



10.散点图


实例

girls_grades = [34, 25, 40, 40, 50, 66, 71, 67, 80, 89]
boys_grades = [30, 29, 49, 48, 56, 70, 55, 81, 70, 85]
homework_finish = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
 
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
ax.scatter(homework_finish, boys_grades, color = 'b', alpha = 0.5)
ax.scatter(homework_finish, girls_grades, color = 'r', alpha = 0.5)
ax.set_title('散点图实例')
ax.set_xlabel('作业完成情况(%)')
ax.set_ylabel('成绩')
ax.legend(labels = ('男生','女生'))
 
plt.show()


结果:




11.直方图和密度曲线


语法

对于一维数据的可视化,一般使用直方图和核密度曲线,seaborn.distplot()函数可以方便地在同一图像上进行直方图和密度曲线的绘制,语法如下:

import seaborn as snssns.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None) 

常用参数:

bins:int或list,控制直方图的划分,比如[0,1,2,3]以0,1,2,3为分割点,形成区间[0,1],[1,2],[2,3],区间外的值不计入

hist:是否显示直方图(默认为True)

kde:是否显示核密度估计(默认为True)

rug:控制是否生成观测数值的小细条

hist_kws, kde_kws, rug_kws, fit_kws:接收字典类型,可以自行定义更多高级的样式


实例

# 已有salarys是一个薪资列表,每个值已经除以1000
plt.figure(dpi=200)
sns.distplot(salarys, hist = True, kde = True, kde_kws={"color":"r", "lw":1.5, 'linestyle':'-'})
plt.axvline(mean, color='r', linestyle=":")
plt.text(mean, 0.01, '平均薪资: %.1f千'%(mean), color='r', horizontalalignment = 'center', fontsize = 15)
plt.xlim(0,50)
plt.xlabel('薪资分布(单位:千)')
plt.title('数据分析岗位在全国主要城市的薪资分布')
plt.savefig('./数据分析岗位在全国主要城市的薪资分布.jpg')
plt.show()

结果:



12.关键词频统计


语法

词云图是一种用来展现高频关键词的可视化表达,通过文字、色彩、图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息。wordcloud是优秀的词云展示第三方库,它把词云当作一个WordCloud对象,绘制词云的形状,尺寸和颜色都可以设定。

cloud = WordCloud(Parameters).generate(words_str) # word_str:以空格分隔的词组成的字符串

实例

# words是一个由空格分隔的职位技能要求词组成的字符串
cloud = WordCloud(
    font_path='/System/Library/Fonts/STHeiti Light.ttc',    # 设置字体文件获取路径,默认字体不支持中文
    background_color='white',    # 设置背景颜色  默认是black
    max_words=20,    # 词云显示的最大词语数量
    random_state = 1,  # 设置随机生成状态,即多少种配色方案
    collocations = False,    # 是否包括词语之间的搭配,默认True,可能会产生语意重复的词语
    width=1200, height=900      #设置大小,默认图片比较小,模糊
).generate(words)
plt.figure(dpi=200)
plt.imshow(cloud)   # 该方法用来在figure对象上绘制传入图像数据参数的图像
plt.axis('off')     # 设置词云图中无坐标轴
plt.savefig("./技能关键词频统计.jpg")
plt.show()

结果:



13.Andrews曲线

Andrews曲线是一种用来对多维数据降维可视化的工具

df = pd.read_csv('data.csv')    
plt.figure(figsize=(12,9),dpi= 100)    
pd.plotting.andrews_curves(df, 'Stage_Class', color=['r','b','g'])	# 第二个参数:二维表中类别列的列名    
plt.grid(alpha=0.3)    
plt.show()
三种肝癌的基因表达数据Andrews曲线
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的西西弗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值