python柱状图数据标签(python柱状图代码)

http://www.itjxue.com  2023-03-29 02:52  来源:未知  点击次数: 

数据蛙-Python进阶

这是漫长的一周,本周完成了Python的进阶模块,主要是pandas、numpy、matplotlib、seaborn、pyecharts这些模块的学习以及一个实际的案例:商品销售情况分析,之前一直觉得课程难度不够,但到这一周难度就大大提高了。尤其是案例练习中的RFM模型和用户生命周期建立,看懂不难但是自己写一直出错,在不断出错不断尝试中知识得到了积累,另外可视化部分没有什么练习题,希望后面可以加上一些这方面的练习,接下来分模块来总结一下学习的内容。

重新设置索引:df.set_index()

Series格式转换为DataFrame:df.to_frame()

文件读取:pd.read_csv(filepath, header = 0,skiprows=[1,2])?

使用位置做索引:df.loc[0]????????使用列表做索引:df.loc[[0,1,2]]

使用切片做索引:df.loc[0:4]????????使用bool类型索引:df[df['年龄']30]

loc 是基于索引值的,切片是左闭右闭的

iloc 是基于位置的,切片是左闭右开的

修改列索引:df.rename(columns={'姓名':'name', '年龄':'age'},inplace=True)

替换一个值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)

对数据进行排序:df.sort_values('age')

累加求和:df.cumsum(0)

删除列:del df['player']?????????删除行:df.drop(labels=0)?labels 是行列的名字

数据拼接:pd.concat([left,right],axis=1)

# 指定列进行关联,默认是 inner join ????result = pd.merge(left,right,on='key')

#多个关联条件:result = pd.merge(left, right, on=['key1', 'key2'])

#左连接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])

# 列名不一样的关联:pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])

#单个分组:groups = df.groupby('district')

# 作用多个聚合函数:groups.agg([np.mean,np.sum,np.std])

# 针对具体列聚合 groups.age.agg([np.mean,np.sum,np.std])

# 不同列不同聚合函数 groups.agg({"age":np.mean,"novip_buy_times":np.sum})

分组后该列值求和显示:groups['vip_buy_times'].transform('sum')

通常用于求占比:transform(lambda x: x /sum(x))

# 填充指定值:np.full([3,4],1)

# 起始为10,5为步长,30为结尾取不到:np.arange(10, 30, 5)

#随机矩阵:np.random.random((2,3))

# 平均划分:np.linspace( 0, 2*pi, 100 )

# 类型及转换:vector.astype('float')

# 多维变一维:matrix.ravel()

# 矩阵的扩展:a = np.arange(0, 40, 10)? ? b = np.tile(a, (3, 5))? ? # 行变成3倍,列变成5倍

# 水平拼接:np.hstack((a,b))? 竖直拼接:np.vstack((a,b))

# 竖直分割:np.hsplit(a,3)? ? #水平分割:np.vsplit(a,3)

8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].

A:df.loc[df.index[[3,4,8]],['animal','age']]

行采用位置,列采用普通索引,这里利用index函数将位置变化为具体的普通索引,再利用loc函数

19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False

A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函数替换

A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函数替换

最大最小值的索引:df.idxmax、df.idxmin

找出最大最小的前N个数:nlargest()和nsmallest()?

将原表分组 并设置分段区间 pd.cut(df['A'], np.arange(0, 101, 10))

resample函数 日期重采样:s.resample('M').mean()

TimeGrouper 重组:s.groupby(pd.TimeGrouper('4M')).idxmax()

split 分割函数:temp = df['From_To'].str.split('_', expand=True) True为DataFrame

两个DataFrame拼接用join:df = df.join(temp)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

%matplotlib inline 直接显示

折线图:plt.plot(x,y,color = 'r')

柱状图:plt.bar(x,y)? plt.barh(x,y) 多个bar x设置不同 堆积图 bottom设置不同

散点图:plt.scatter(x, y, c=colors, alpha=0.5, s = area)

直方图:plt.hist(a,bins= 20) bin代表分隔的最小单位

plt.legend() 显示图例

for a,b in zip(X+W[i],data[i]):

? ? plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加数据标签

plt.annotate('注释文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="-")) 添加注释文本

plt.xlabel("Group") x轴标题

plt.ylabel("Num") y轴标题

fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray')? 绘制多个图形

axes[0,0] axes[0,1] axes[1,0] axes[1,1]

pylab.rcParams['figure.figsize'] = (10, 6) # 调整图片大小

动态展示图表

from pyecharts.charts import Bar

from pyecharts import options as opts

** pyecharts 绘图的五个步骤:**

创建图形对象:bar = Bar()

添加绘图数据:bar.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])

? ? ? ? ???????????????? bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])

? ? ? ? ? ? ? ? ? ? ? ? ?bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])

配置系列参数:对标签、线型等的一些设置

配置全局参数:bar.set_global_opts(title_opts=opts.TitleOpts(title="销售情况"))

渲染图片:生成本地 HTML 文件 bar.render("mycharts.html")? bar.render()

notebook 渲染:bar.render_notebook()

bar = (Bar()

? ? .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])

? ? .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])

? ? .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])

? ? .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))

)

bar.render_notebook()

柱状图:Bar()

条形图:bar.reversal_axis() #翻转XY轴,将柱状图转换为条形图

折线图:from pyecharts.charts import Line? line=Line()

饼图:from pyecharts.charts import Page, Pie????Pie()?

转换日期类型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")

将日期转换为月为单位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期显示为当月第一天

去除日期单元值:order_diff/ np.timedelta64(1,'D')

过滤部分极值:grouped_user.sum() .query('order_products100') .order_amount

数据透视表:rfm=df.pivot_table( index ='user_id', values =['order_products','order_amount'], aggfunc ={'order_amount':'sum','order_products':'sum'})

map() 方法是pandas.series.map()方法, 对DF中的元素级别的操作, 可以对df的某列或某多列

applymap(func) 也是DF的属性, 对整个DF所有元素应用func操作

purchase_r=pivoted_counts.applymap(lambda x: 1 if x1 else np.NaN if x==0 else 0)

apply(func) 是DF的属性, 对DF中的行数据或列数据应用func操作,也可用于Series

apply(lambda x:x.cumsum()/x.sum())? ? 累计占比

apply(lambda x:x/x.sum(),axis=0)? ? ?每一列中每行数据占比

下周开始进入数据分析思维的课程,很期待后面的课程以及项目,加油!

python可视化神器——pyecharts库

无意中从今日头条中看到的一篇文章,可以生成简单的图表。据说一些大数据开发们也是经常用类似的图表库,毕竟有现成的,改造下就行,谁会去自己造轮子呢。

pyecharts是什么?

pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒, pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图 。使用pyecharts可以生成独立的网页,也可以在flask、django中集成使用。

安装很简单:pip install pyecharts

如需使用 Jupyter Notebook 来展示图表,只需要调用自身实例即可,同时兼容 Python2 和 Python3 的 Jupyter Notebook 环境。所有图表均可正常显示,与浏览器一致的交互体验,简直不要太强大。

参考自pyecharts官方文档:

首先开始来绘制你的第一个图表

使用 Jupyter Notebook 来展示图表,只需要调用自身实例即可

add() 主要方法,用于添加图表的数据和设置各种配置项

render() 默认将会在根目录下生成一个 render.html 的文件,文件用浏览器打开。

使用主题

自 0.5.2+ 起,pyecharts 支持更换主体色系

使用 pyecharts-snapshot 插件

如果想直接将图片保存为 png, pdf, gif 格式的文件,可以使用 pyecharts-snapshot。使用该插件请确保你的系统上已经安装了 Nodejs 环境。

安装 phantomjs $ npm install -g phantomjs-prebuilt

安装 pyecharts-snapshot $ pip install pyecharts-snapshot

调用 render 方法 bar.render(path='snapshot.png') 文件结尾可以为 svg/jpeg/png/pdf/gif。请注意,svg 文件需要你在初始化 bar 的时候设置 renderer='svg'。

图形绘制过程

基本上所有的图表类型都是这样绘制的:

chart_name = Type() 初始化具体类型图表。

add() 添加数据及配置项。

render() 生成本地文件(html/svg/jpeg/png/pdf/gif)。

add() 数据一般为两个列表(长度一致)。如果你的数据是字典或者是带元组的字典。可利用 cast() 方法转换。

多次显示图表

从 v0.4.0+ 开始,pyecharts 重构了渲染的内部逻辑,改善效率。推荐使用以下方式显示多个图表。如果使是 Numpy 或者 Pandas,可以参考这个示例

当然你也可以采用更加酷炫的方式,使用 Jupyter Notebook 来展示图表,matplotlib 有的,pyecharts 也会有的

Note: 从 v0.1.9.2 版本开始,废弃 render_notebook() 方法,现已采用更加? pythonic ?的做法。直接调用本身实例就可以了。

比如这样

还有这样

如果使用的是自定义类,直接调用自定义类示例即可

图表配置

图形初始化

通用配置项

xyAxis:平面直角坐标系中的 x、y 轴。(Line、Bar、Scatter、EffectScatter、Kline)

dataZoom:dataZoom 组件 用于区域缩放,从而能自由关注细节的数据信息,或者概览数据整体,或者去除离群点的影响。(Line、Bar、Scatter、EffectScatter、Kline、Boxplot)

legend:图例组件。图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。

label:图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。

lineStyle:带线图形的线的风格选项(Line、Polar、Radar、Graph、Parallel)

grid3D:3D笛卡尔坐标系组配置项,适用于 3D 图形。(Bar3D, Line3D, Scatter3D)

axis3D:3D 笛卡尔坐标系 X,Y,Z 轴配置项,适用于 3D 图形。(Bar3D, Line3D, Scatter3D)

visualMap:是视觉映射组件,用于进行『视觉编码』,也就是将数据映射到视觉元素(视觉通道)

markLinemarkPoint:图形标记组件,用于标记指定的特殊数据,有标记线和标记点两种。(Bar、Line、Kline)

tooltip:提示框组件,用于移动或点击鼠标时弹出数据内容

toolbox:右侧实用工具箱

图表详细

Bar(柱状图/条形图)

Bar3D(3D 柱状图)

Boxplot(箱形图)

EffectScatter(带有涟漪特效动画的散点图)

Funnel(漏斗图)

Gauge(仪表盘)

Geo(地理坐标系)

GeoLines(地理坐标系线图)

Graph(关系图)

HeatMap(热力图)

Kline/Candlestick(K线图)

Line(折线/面积图)

Line3D(3D 折线图)

Liquid(水球图)

Map(地图)

Parallel(平行坐标系)

Pie(饼图)

Polar(极坐标系)

Radar(雷达图)

Sankey(桑基图)

Scatter(散点图)

Scatter3D(3D 散点图)

ThemeRiver(主题河流图)

TreeMap(矩形树图)

WordCloud(词云图)

用户自定义

Grid 类:并行显示多张图

Overlap 类:结合不同类型图表叠加画在同张图上

Page 类:同一网页按顺序展示多图

Timeline 类:提供时间线轮播多张图

统一风格

注:pyecharts v0.3.2以后,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表,可自行安装对应的地图文件包。

地图文件被分成了三个 Python 包,分别为:

全球国家地图:

echarts-countries-pypkg

中国省级地图:

echarts-china-provinces-pypkg

中国市级地图:

echarts-china-cities-pypkg

直接使用python的pip安装

但是这里大家一定要注意,安装完地图包以后一定要重启jupyter notebook,不然是无法显示地图的。

显示如下:

总得来说,这是一个非常强大的可视化库,既可以集成在flask、Django开发中,也可以在做数据分析的时候单独使用,实在是居家旅行的必备神器啊

如何解决python柱状图标签和图重叠的问题?

个人看法哈,数据图形化,除了直观地展示数据外,还需注意图表的美观。

对于这个图,内部柱子都快顶到上边界了。为了美观,一般都会留白的,比如下面这个图:

所以,如要解决你所提出的问题,就我的了解而言,只有增大Y轴的数值。一旦Y轴的值增大,图的上部分就留出了足够多的空白,一方面解决你所遇到的问题,另一方面图形看起来美观自然一些,没之前那么紧凑。

Python matplotlib绘制条形柱状图并添加数据标签

最近在学习数据分析,用matplotlit绘制条形图,柱状图老师讲了加标签的方法,但是没有讲横向条形图加数据标签的方法,但是我想到业务场景可能会用到,于是自己写了一个脚本练习一下,用竖向条形图的方法加数据标签,怎么都加不上,百度找到一些解决方法,然后自己改了一下终于解决了这个问题。

重点在这个for循环

(责任编辑:IT教学网)

更多

推荐其他源码文章