afghgh 2024-06-12 22:57 采纳率: 0%
浏览 9
已结题

jupyter notebook

img

img

img

有人知道我的箱线图为什么画不出来吗?前面有数据信息显示,这样打印调试信息没有数据显示

# 导包
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np# 读取数据
rf = pd.read_csv('lagou.csv',encoding='utf-8')# 查看数据基本信息
print(rf.head())print(rf.info())# 对数据框 'rf' 按照 'address' 列进行分组,分组后的数据中选择 'address''company' 两列,计算每个分组中的各列的数量
address=rf.groupby('address',as_index=False).count()[['address','company']]address# 设置 matplotlib 的全局字体为 'SimHei'(黑体),以支持中文显示,设置 matplotlib 以正确显示负号
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(10,6))
sns.countplot(x='address', data=rf)
plt.title('不同区域数据分析师职位的需求情况')
plt.xlabel('地区')
plt.ylabel('职位空缺数量')
plt.savefig('柱形图3.1.jpg')
plt.show()# 对数据框 'rf''foursquare' 列的值进行计数,将计数结果按降序排列
sorted_rf=rf['foursquare'].value_counts().sort_values(ascending=False)sorted_rf# 重置索引,将原索引作为新的一列添加到数据框中
sorted_rf = sorted_rf.reset_index()
# 重命名列名
sorted_rf.columns = ['行业', '职位空缺的数量']
plt.figure(figsize=(19,7))
# 使用 Seaborn的barplot函数绘制条形图,data=sorted_rf:使用数据框'sorted_rf'中的数据,order=sorted_rf['行业']:按照 'sorted_rf''行业'列的顺序绘制条形图
sns.barplot(x='行业',y='职位空缺的数量', data=sorted_rf,order=sorted_rf['行业'])
plt.title('不同行业数据分析师岗位的需求情况')
plt.xlabel('行业')
plt.ylabel('职位空缺的数量')
plt.xticks(rotation=90) 
plt.savefig('柱形图3.2.jpg')
plt.show()#对数据框 rf 中 experience 列的值进行计数
rf['experience'].value_counts()plt.figure(figsize=(15,10))
sns.countplot(x='experience', data=rf)
plt.title('数据分析师对应聘者工作年限的要求')
plt.xlabel('工作年限')
plt.ylabel('职位空缺的数量')
plt.savefig('柱形图3.3.jpg')
plt.show()education_counts =rf['education'].value_counts()
education_countsplt.figure(figsize=(10, 6))  
plt.pie(education_counts, labels=education_counts.index, autopct='%1.1f%%')  
plt.title('数据分析师对求职者学历的要求')  
plt.savefig('饼图3.4.jpg')
plt.show()# 正则表达式,匹配一个或多个数字
Regex_number = '\d+'
# 使用正则表达式查找 'salary' 列中的所有数字,并将其存储在新列 'min' 中
rf['min'] = rf['salary'].str.findall(Regex_number)
# 初始化两个空列表,用于存储最小工资和最大工资
min_salary_list = []
max_salary_list = []
# 遍历 'min' 列中的每个列表
for s in rf['min']:
    # 遍历每个列表的第一个元素(最小工资)
    for min_num in s[:1]:
        # 将工资数值字符串转换为整数,并乘以 1000
        min_salary = int(min_num + '000')
        # 将计算出的最小工资添加到 min_salary_list 列表中
        min_salary_list.append(min_salary)
    # 遍历每个列表的第二个及之后的元素(最大工资)
    for max_num in s[1:]:
        # 将工资数值字符串转换为整数,并乘以 1000
        max_salary = int(max_num + '000')
        # 将计算出的最大工资添加到 max_salary_list 列表中
        max_salary_list.append(max_salary)
# 将计算出的最小工资列表赋值给 'min' 列
rf['min'] = min_salary_list
# 将计算出的最大工资列表赋值给 'max' 列
rf['max'] = max_salary_listplt.figure(figsize=(9.6,7))
plt.hist(rf['min'],alpha=0.9)
plt.xlabel('薪酬')
plt.ylabel('频数')
plt.title('数据分析师的最低薪酬范围')
plt.savefig('直方图3.5.1.jpg')
plt.show()plt.figure(figsize=(9.6,7))
plt.hist(rf['max'],alpha=0.9)
plt.xlabel('薪酬')
plt.ylabel('频数')
plt.title('数据分析师的最高薪酬范围')
plt.savefig('直方图3.5.2.jpg')
plt.show()# 处理 figure 列,确保包含 '人' 字符
def handle (size):
   return '人' in size
rf=rf[rf['figure'].apply(handle)]rfrf['salary']rf['figure']# 设置 matplotlib 的全局字体为 'SimHei'(黑体),以支持中文显示,设置 matplotlib 以正确显示负号
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = Falsedata=pd.DataFrame({
    'Salary':rf['salary'],
    'CompanySize':rf['figure']
})
# 解析薪资数据,将薪资区间转换为平均薪资
def parse_salary(salary):
    try:
        low, high = salary.replace('k', '').split('-')
        return (int(low) + int(high)) / 2 * 1000#求中位数
    except:
        return np.nan
data['Salary'] = data['Salary'].apply(parse_salary)data['Salary']rf.loc[:,'salary']=data['Salary']rfa=rf.groupby('figure',as_index=False).count()[['figure','salary']]a# 分组计算公司规模对应的薪酬数据
List15_50 = []
List50_150 = []
List150_500 = []
List500_2000 = []
List2000 = []
for i in range(len(rf1)):
    if rf1.iloc[i]['figure'] == '15-50人':
        List15_50.append(rf1.iloc[i]['salary'])
    elif rf1.iloc[i]['figure'] == '50-150人':
        List50_150.append(rf1.iloc[i]['salary'])
    elif rf1.iloc[i]['figure'] == '150-500人':
        List150_500.append(rf1.iloc[i]['salary'])
    elif rf1.iloc[i]['figure'] == '500-2000人':
        List500_2000.append(rf1.iloc[i]['salary'])
    elif rf1.iloc[i]['figure'] == '2000人以上':
        List2000.append(rf1.iloc[i]['salary'])
# 打印检查每个列表的数据
print("15-50人:", len(List15_50), List15_50[:5])
print("50-150人:", len(List50_150), List50_150[:5])
print("150-500人:", len(List150_500), List150_500[:5])
print("500-2000人:", len(List500_2000), List500_2000[:5])
print("2000人以上:", len(List2000), List2000[:5])# 创建公司规模与薪酬之间关系的箱线图
plt.figure(figsize=(12, 6))
label = ['15-50人', '50-150人', '150-500人', '500-2000人', '2000人以上']
company_size = [List15_50, List50_150, List150_500, List500_2000, List2000]
plt.boxplot(company_size, notch=True, labels=label, patch_artist=True)
plt.xlabel('公司规模')
plt.ylabel('薪酬分布')
plt.title('公司规模与薪酬之间的关系')
plt.savefig('箱线图3.6.jpg')
plt.show()a=rf.groupby('experience',as_index=False).count()[['experience','salary']]aprint(rf.columns)# 查看 'experience' 列中的唯一值
print(rf['experience'].unique())experience1=rf.loc[rf['experience']=='经验不限',['salary']]
experience2=rf.loc[rf['experience']=='经验应届毕业生',['salary']]
experience3=rf.loc[rf['experience']=='经验1年以下',['salary']]
experience4=rf.loc[rf['experience']=='经验1-3年',['salary']]
experience5=rf.loc[rf['experience']=='经验3-5年',['salary']]
experience6=rf.loc[rf['experience']=='经验5-10年',['salary']]
experience7=rf.loc[rf['experience']=='经验10年以上',['salary']]
# 确保 'salary' 列已正确解析并且没有 NaN 值
experience1 = experience1.dropna(subset=['salary'])
experience2 = experience2.dropna(subset=['salary'])
experience3 = experience3.dropna(subset=['salary'])
experience4 = experience4.dropna(subset=['salary'])
experience5 = experience5.dropna(subset=['salary'])
experience6 = experience6.dropna(subset=['salary'])
experience7 = experience7.dropna(subset=['salary'])experience_1=experience1['salary'].tolist()
experience_2=experience2['salary'].tolist()
experience_3=experience3['salary'].tolist()
experience_4=experience4['salary'].tolist()
experience_5=experience5['salary'].tolist()
experience_6=experience6['salary'].tolist()
experience_7=experience7['salary'].tolist()# 打印调试信息
print(f"经验不限: {experience_1}")
print(f"经验应届毕业生: {experience_2}")
print(f"经验1年以下: {experience_3}")
print(f"经验1-3年: {experience_4}")
print(f"经验3-5年: {experience_5}")
print(f"经验5-10年: {experience_6}")
print(f"经验10年以上: {experience_7}")plt.figure(figsize=(18,6))
label=['经验不限','经验应届毕业生','经验1年以下','经验1-3年','经验3-5年','经验5-10年','经验10年以上']
experience=(experience_1,experience_2,experience_3,experience_4,experience_5,experience_6,experience_7)
plt.boxplot(experience,notch=True,labels=label,patch_artist=True)
plt.xlabel('工作经验')
plt.ylabel('薪酬分布')
plt.title('工作经验与薪酬的关系')
plt.savefig('箱线图3.7.jpg')
plt.show()

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-12 22:57
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    从描述来看,你正在尝试绘制一个箱线图(boxplot),但遇到了一些困难,图似乎没有正确显示。在处理这类问题时,确保数据正确加载、选择正确的库进行绘图、以及正确配置绘图参数是非常重要的。

    步骤 1: 确认数据加载与预处理

    首先,确认rf DataFrame是否已经正确加载了数据,并且experiencesalary列的数据类型适合绘图。通常,experience应该是分类变量,而salary应该是数值型的。

    步骤 2: 使用合适的库绘制箱线图

    对于箱线图,matplotlibseaborn都是常用的选择。下面是一个使用seaborn库来绘制箱线图的例子,基于你提供的数据结构:

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # 假设rf是你的DataFrame
    # rf = ...
    
    # 使用seaborn绘制箱线图
    sns.boxplot(x='experience', y='salary', data=rf)
    plt.title('Salary Distribution by Experience')
    plt.show()
    

    步骤 3: 检查异常情况

    如果上述代码仍然无法显示箱线图,可能的原因包括但不限于:

    • 数据中存在NaN或非数字值。
    • 图形界面未正确设置(例如,在Jupyter Notebook中运行 %matplotlib inline)。
    • 绘图库版本不兼容。

    步骤 4: 调试与解决

    为了进一步调试,可以尝试以下几点:

    1. 检查salary列是否有非数字值:

      print(rf['salary'].isna().sum())
      print(rf['salary'].unique())
      
    2. 确认图形界面设置: 在Jupyter Notebook中运行 %matplotlib inline 确保图表会内联显示。

    3. 更新绘图库: 如果使用的是旧版本的seabornmatplotlib,尝试更新它们到最新版本。

    步骤 5: 进一步的诊断

    如果以上步骤都无法解决问题,可能需要更详细的错误信息或日志来定位具体原因。在Python中,通常错误会直接输出到控制台,注意查看控制台输出的信息,这通常能提供解决问题的关键线索。

    如果你能够提供具体的错误信息或更多细节,将有助于更准确地诊断问题所在。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 修改了问题 6月12日
  • 创建了问题 6月12日

悬赏问题

  • ¥15 咨询一下有关于王者荣耀赢藏战绩
  • ¥100 求购一套带接口实现实习自动签到打卡
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?