pandas速成笔记(4)-数据图表

上篇继续,做数据分析,各种数据图表是必不可少的,还是以下面这张表为例:

pandas速成笔记(4)-数据图表

一、单列柱状图

假设要把9月份,A、B这2个分类的Amount提取出来画一个柱状图,可以这么做:

python;collapse:true;;gutter:true; import pandas as pd import matplotlib.pyplot as plt</p> <p>df = pd.read_excel("./data/test.xlsx")</p> <h1>过滤出9月份的,A,B二个分类的数据</h1> <p>df = df.loc[df.Month.apply(lambda m: m == '2021-09')] \ .loc[df.Category.apply(lambda c: c in ['A', 'B'])]</p> <h1>如果希望柱状图按从高到低排好,必须先把数据排好序</h1> <p>df.sort_values(by="Amount", inplace=True, ascending=False)</p> <h1>用DataFrame的plot来绘图</h1> <p>df.plot.bar(x="Category", y="Amount", color="Orange", title="Amount(Month:2021-09)") plt.tight_layout() plt.show()</p> <pre><code> 效果如下: ![pandas速成笔记(4)-数据图表](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20220811/27612-20220320173909849-2091787025.png) DateFrame自带的plot虽然能画图,但是如果希望能控制更灵活,比如:设置title的字体大小,x轴的标签不希望横着放(或旋转指定角度)等,还可以直接调用plt底层的方法 ;collapse:true;;gutter:true;
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel("./data/test.xlsx")

# 过滤出9月份的,A,B二个分类的数据
df = df.loc[df.Month.apply(lambda m: m == ‘2021-09’)] \
.loc[df.Category.apply(lambda c: c in [‘A’, ‘B’])]

# 如果希望柱状图按从高到低排好,必须先把数据排好序
df.sort_values(by="Amount", inplace=True, ascending=False)

# 也可以用plt原生的画图方法来实现,有更多控制选项
plt.bar(df.Category, df.Amount, color="Orange")
plt.xticks(df.Category, rotation="0")
plt.xlabel("Category")
plt.ylabel("Amount")
plt.title("Amount(Month:2021-09)", fontsize="16")
plt.tight_layout()
plt.show()

效果一样:

pandas速成笔记(4)-数据图表

二、多列对比柱状图

假设数据长这样,想对比看看9、10这2个月,各Category的值对比:

pandas速成笔记(4)-数据图表

python;collapse:true;;gutter:true; import pandas as pd import matplotlib.pyplot as plt</p> <p>df = pd.read_excel("./data/test_group.xlsx") df.sort_values(by=["2021-10"], ascending=False, inplace=True)</p> <h1>核心部分</h1> <p>df.plot.bar(x="Category", y=["2021-09", "2021-10"], color=["orange", "red"])</p> <h1>设置标题、x,y轴文本及字体</h1> <p>plt.title("Amount of 2021-09 ~ 2021-10", fontsize="16", fontweight="bold") plt.xlabel("Category", fontweight="bold") plt.ylabel("Amount", fontweight="bold")</p> <h1>get current axis</h1> <p>ax = plt.gca()</p> <h1>ha = horizontal align</h1> <h1>x轴标签,旋转45度,水平对齐方式为right</h1> <p>ax.set_xticklabels(df.Category, rotation=45, ha="right")</p> <h1>get current figure</h1> <p>f = plt.gcf()</p> <h1>设置左边留20%空白,底部留20%空白</h1> <p>f.subplots_adjust(left=0.2, bottom=0.2)</p> <h1>plt.tight_layout()</h1> <p>plt.show()</p> <pre><code> ![pandas速成笔记(4)-数据图表](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20220811/27612-20220320180502574-1834167202.png) 三、叠加柱状图 还是刚才的数据,只要加一个参数stacked=True,就变成了叠加柱状图 ;collapse:true;;gutter:true;
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel("./data/test_group.xlsx")

# 加上stacked=True后,将变成叠加柱状图
df.plot.bar(x="Category", y=["2021-09", "2021-10"], stacked=True)

# 下面都是美化选项
plt.title("Amount of 2021-09 ~ 2021-10", fontsize="16", fontweight="bold")
plt.xlabel("Category", fontweight="bold")
plt.ylabel("Amount", fontweight="bold")
ax = plt.gca()
ax.set_xticklabels(df.Category, rotation=45, ha="right")
f = plt.gcf()
f.subplots_adjust(left=0.15, bottom=0.20)
plt.show()

效果如下:

pandas速成笔记(4)-数据图表

如果想让柱子高度从大到小排列,就不能简单的按2021-09或2021-10中的某一列来排序了!因为柱子的高度,其实是这2列值的和,所以要新增1个计算列:

python;collapse:true;;gutter:true; ...</p> <h1>新增1个计算列</h1> <p>df["total"] = df["2021-09"] + df["2021-10"] df.sort_values(by="total", inplace=True, ascending=False)</p> <p>df.plot.bar(x="Category", y=["2021-09", "2021-10"], stacked=True) ...</p> <pre><code> 效果: ![pandas速成笔记(4)-数据图表](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20220811/27612-20220320182453255-563012361.png) 叠加柱状图还可以改方向,比如:变成水平的,只需要把bar()换成barh()即可 ;collapse:true;;gutter:true;
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel("./data/test_group.xlsx")

# barh 即bar-horizontal
df.plot.barh(x="Category", y=["2021-09", "2021-10"], stacked=True)

plt.title("Amount of 2021-09 ~ 2021-10", fontsize="16", fontweight="bold")
plt.xlabel("Category", fontweight="bold")
plt.ylabel("Amount", fontweight="bold")
f = plt.gcf()
f.subplots_adjust(left=0.15, bottom=0.20)
plt.show()

pandas速成笔记(4)-数据图表

四、饼图

饼图通常只需要1列,来看该列各行值的占比

python;collapse:true;;gutter:true; import pandas as pd import matplotlib.pyplot as plt</p> <p>df = pd.read_excel("./data/test_group.xlsx", index_col="Category")</p> <h1>核心部分</h1> <p>df["2021-09"].plot.pie()</p> <h1>图表美化</h1> <p>plt.title("Amount of 2021-09", fontsize="16", fontweight="bold") plt.ylabel("Amount", fontweight="bold") f = plt.gcf() f.subplots_adjust(left=0.15, bottom=0.20) plt.show()</p> <pre><code> 效果: ![pandas速成笔记(4)-数据图表](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20220811/27612-20220320184049901-220227743.png) 默认情况下,饼图各部分是逆时针方向的,如果想换个方向,加上counterclock=False即可 ;gutter:true;
# 核心部分
df["2021-09"].plot.pie(counterclock=False)

效果:

pandas速成笔记(4)-数据图表

五、折线图

python;collapse:true;;gutter:true; import pandas as pd import matplotlib.pyplot as plt</p> <p>df = pd.DataFrame(columns=["Month", "Amount"], data=[['2021-09', 10], ['2021-10', 15], ['2021-11', 8], ['2021-12', 11], ['2022-01', 11] ]) df.set_index("Month", inplace=True) print(df)</p> <h1>核心部分</h1> <p>df.plot(y=['Amount'], color="red")</p> <h1>图表美化</h1> <p>plt.title("Amount of Month", fontsize="16", fontweight="bold") plt.xlabel("Month", fontweight="bold") plt.ylabel("Amount", fontweight="bold") f = plt.gcf() f.subplots_adjust(left=0.15, bottom=0.20) plt.show()</p> <pre><code> 输出: ;collapse:true;;gutter:true;
Amount
Month
2021-09 10
2021-10 15
2021-11 8
2021-12 11
2022-01 11

pandas速成笔记(4)-数据图表

Original: https://www.cnblogs.com/yjmyzz/p/pandas_turorial_4.html
Author: 菩提树下的杨过
Title: pandas速成笔记(4)-数据图表

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/8405/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部