0

这是我的代码。

fig, ax1 = plt.subplots() 
fig.set_figheight(7)
fig.set_figwidth(12)
ax1.bar(df.index, df['occurence of defects'], color="C0")
ax1.set_ylabel("Qty", color="C0")
ax1.tick_params(axis="y", colors="C0")
ax1.set_xlabel("Defect")
ax1.set_xticklabels(df['Name of Defect'],rotation=45)
ax2 = ax1.twinx()
ax2.plot(df.index, df["cum percentage"], color="C1", marker="D", ms=7)
ax2.yaxis.set_major_formatter(PercentFormatter())
ax2.tick_params(axis="y", colors="C1")
plt.show()

这是输出的 ss, 在此处输入图像描述 我在缺少标签的地方画了圈。我该如何解决?甚至 x 轴上的当前标签也不在它们的假定位置。

4

2 回答 2

1

我不知道细节,但它会根据刻度数自动确定图形的比例。在这种情况下,我们将跳过一个。尝试禁用#ax1.set_xticklabels(df['Name of Defect'],rotation=45),你会明白的。如果您指定所需轴的刻度数,它将与标签匹配并显示。

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
import numpy as np

df = pd.DataFrame({'Name of Defect':list('ABCDEFGHIJKLMNOP'), 'occurence of defects':np.random.randint(1,10,16)})

df['cum'] = df['occurence of defects'].cumsum()
df.sort_values('occurence of defects', ascending=False, ignore_index=True, inplace=True)
df['per'] = df['cum'].apply(lambda x: x / df['cum'].sum())
df['cum percentage'] = df['per'].cumsum()

fig, ax1 = plt.subplots() 
fig.set_figheight(7)
fig.set_figwidth(12)
ax1.bar(df.index, df['occurence of defects'], color="C0")
ax1.set_ylabel("Qty", color="C0")
ax1.tick_params(axis="y", colors="C0")
ax1.set_xlabel("Defect")
ax1.set_xticks(np.arange(0,16))
ax1.set_xticklabels(df['Name of Defect'],rotation=45)
ax2 = ax1.twinx()
ax2.plot(df.index, df["cum percentage"], color="C1", marker="D", ms=7)
ax2.yaxis.set_major_formatter(PercentFormatter())
ax2.tick_params(axis="y", colors="C1")
plt.show()

在此处输入图像描述

于 2022-02-27T12:54:49.003 回答
0

Matplotlib有这样一个特性,当您调用 set_xticklabels时,还应该调用set_xticks(以指定这些标签的放置位置(在哪个x坐标处))。

在您的情况下,应将x标签放置在每个条形下方,因此请插入:

ax1.set_xticks(df.index)

前:

ax1.set_xticklabels(df['Name of Defect'], rotation=45)

原因是x标签通常不应放置在每个 x坐标上,尤其是当绘图类型不是bar时。

另一个提示:由于您的x标签很长,请考虑旋转 90 或其他,但大于 45。

于 2022-02-27T13:01:36.603 回答