【问题标题】:Create multiple charts using matplotlib from json in python在 python 中使用来自 json 的 matplotlib 创建多个图表
【发布时间】:2021-01-26 17:09:05
【问题描述】:

这是我在stackoverflow上的第一篇文章,如果我做错了什么,请见谅。

我正在创建一个烧瓶网络应用程序,您可以在其中回答调查。

我想根据调查回复创建图表,根据用户信息在其中显示调查回复,例如显示有多少人喜欢披萨与他们的年龄相关。

我将调查结果保存为 json 格式,如下所示:

{
  "results": [
    {
      "question": {
        "Do you like pasta?": "no", 
        "Do you like pizza": "no"
      }, 
      "user_info": {
        "age": 17, 
        "gender": "Male"
      }
    }, 
    {
      "question": {
        "Do you like pasta?": "no", 
        "Do you like pizza": "yes"
      }, 
      "user_info": {
        "age": 19, 
        "gender": "Male"
      }
    }, 
    {
      "question": {
        "Do you like pasta?": "yes", 
        "Do you like pizza": "no"
      }, 
      "user_info": {
        "age": 13, 
        "gender": "Male"
      }
    }
  ]
}

il chart che vorrei creare è questo:

chart

import matplotlib.pyplot as plt
import numpy as np


labels = ['13', '14', '15', '16']
respose_1 = [50, 20, 15, 66]
respose_2 = [79, 88, 71, 50]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, respose_1, width, label='Si')
rects2 = ax.bar(x + width/2, respose_2, width, label='No')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Respose')
ax.set_xlabel('Age')
ax.set_title('TEST.')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()


def autolabel(rects):
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')


autolabel(rects1)
autolabel(rects2)

fig.tight_layout()
plt.savefig('test3.png')
plt.show()

所以我需要标签 respose_1、respose_2。 我花了几个小时试图从 json 中提取这些信息,但我做不到。

谁能帮帮我?

【问题讨论】:

    标签: python json pandas matplotlib charts


    【解决方案1】:

    您可以迭代您的 json 文件并相当轻松地提取数据。这是一种尝试对内容相对不可知的方法,但我相信还有更好的方法:

    import json
    d = '''
    {
      "results": [
        {
          "question": {
            "Do you like pasta?": "no", 
            "Do you like pizza": "no"
          }, 
          "user_info": {
            "age": 17, 
            "gender": "Male"
          }
        }, 
        {
          "question": {
            "Do you like pasta?": "no", 
            "Do you like pizza": "yes"
          }, 
          "user_info": {
            "age": 19, 
            "gender": "Male"
          }
        }, 
        {
          "question": {
            "Do you like pasta?": "yes", 
            "Do you like pizza": "no"
          }, 
          "user_info": {
            "age": 13, 
            "gender": "Male"
          }
        }
      ]
    }
    '''
    
    j = json.loads(d)
    df = pd.DataFrame()
    for a in j['results']:
        df = pd.concat([df,pd.DataFrame(a).ffill(axis=1).drop(columns='question').T])
    df.reset_index(drop=True, inplace=True)
    
      Do you like pasta? Do you like pizza age gender
    0                 no                no  17   Male
    1                 no               yes  19   Male
    2                yes                no  13   Male
    

    您可以使用seaborn 轻松绘制:

    sns.countplot(data=df, x='age', hue='Do you like pasta?')
    

    【讨论】:

      【解决方案2】:

      json 数据中按年龄列出的所有是或否的说法

      d = {
        "results": [
          {
            "question": {
              "Do you like pasta?": "no", 
              "Do you like pizza": "no"
            }, 
            "user_info": {
              "age": 17, 
              "gender": "Male"
            }
          }, 
          {
            "question": {
              "Do you like pasta?": "no", 
              "Do you like pizza": "yes"
            }, 
            "user_info": {
              "age": 19, 
              "gender": "Male"
            }
          }, 
          {
            "question": {
              "Do you like pasta?": "yes", 
              "Do you like pizza": "no"
            }, 
            "user_info": {
              "age": 13, 
              "gender": "Male"
            }
          }
        ]
      }
      label=set()
      for i in d["results"]:
        label.add(i["user_info"]["age"])
      labels=sorted(label)
      print("Ages")
      print(labels)
      #[13,17,19]
      said_yes_pasta=[]
      said_no_pasta=[]
      said_yes_pizza=[]
      said_no_pizza=[]
      for i in labels:
        _said_yes_pasta=0
        _said_no_pasta=0
        _said_yes_pizza=0
        _said_no_pizza=0
        for j in d["results"]:
          if(j["user_info"]["age"]==i):
            response_pasta=j["question"]["Do you like pasta?"]
            if(response_pasta=="yes"):
              _said_yes_pasta+=1
            else:
              _said_no_pasta+=1
            response_pizza=j["question"]["Do you like pizza"]
            if(response_pizza=="yes"):
              _said_yes_pizza+=1
            else:
              _said_no_pizza+=1
        said_yes_pasta.append(_said_yes_pasta)
        said_yes_pizza.append(_said_yes_pizza)
      
        said_no_pasta.append(_said_no_pasta)
        said_no_pizza.append(_said_no_pizza)
      print("number of dont cake lovers")
      print(said_no_pasta)
      #[0, 1, 1]
      print("number of dont cake pizza")
      print(said_no_pizza)
      #[1,1,0]
      print("number of cake lovers")
      print(said_yes_pasta)
      #[1,0,0]
      print("number of pizza lovers")
      print(said_yes_pizza)
      #[0,0,1]
      

      例如 获取said_yes_pizza

      的列表

      输出

      [0,0,1]
      

      年龄列表

      [13,17,19]
      

      13 岁 0 人对我喜欢披萨的问题表示同意

      19 岁 1 人对此问题表示同意

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多