rsj0315 发表于 2020-5-15 13:28:08

openpyxl和excel的结合画折线图

1.电子表格中任意二维数据wookbook。
2.用openpyxl读取sheet1中数据后,创建一个sheet2,里边用pyechars或者matplotlib画折线图

现在读表的内容会,
用matplotlib画折线图也会,
边读边画就不会了。。。

帮忙举个实例

qiuyouzhi 发表于 2020-5-15 13:30:48

你这俩都会了,咋放在一起就不会了呢?
你可以写俩函数,一个读,一个画图

rsj0315 发表于 2020-5-15 13:52:20

qiuyouzhi 发表于 2020-5-15 13:30
你这俩都会了,咋放在一起就不会了呢?
你可以写俩函数,一个读,一个画图

读的数据,可以print
画的时候引用这个数值,引不明白。
来个实例啊

qiuyouzhi 发表于 2020-5-15 13:53:59

rsj0315 发表于 2020-5-15 13:52
读的数据,可以print
画的时候引用这个数值,引不明白。
来个实例啊

你只需要把print打印的内容放进变量里面就好鸭

Twilight6 发表于 2020-5-15 19:56:44

你发几行数据,我试试看写

rsj0315 发表于 2020-5-16 11:09:56

Twilight6 发表于 2020-5-15 19:56
你发几行数据,我试试看写

A列是时间,按天;
B列是销量,随便给点数据;
C列是成本,随便给点数据;
D列是售价,随便给点数据;
E列是利润率,这个用公式在表格里用百分比显示

Twilight6 发表于 2020-5-16 11:11:03

rsj0315 发表于 2020-5-16 11:09
A列是时间,按天;
B列是销量,随便给点数据;
C列是成本,随便给点数据;


你能随便写几行嘛哈哈
两三行也行~~

rsj0315 发表于 2020-5-16 21:32:05

Twilight6 发表于 2020-5-16 11:11
你能随便写几行嘛哈哈
两三行也行~~

折线图或柱状图都可以

1.实现日期和利润的二维图标,x轴时间,y利润
2.在1的基础上,添加图例选项,显示A和B的利润状况
3.在2的基础上,添加利润率的情况
4.不知道一张图标能能否复合上述所有信息内容?

8楼是表格附件

rsj0315 发表于 2020-5-16 21:33:55

上传不了电子表格的附件,贴张图吧

rsj0315 发表于 2020-5-18 21:00:16

import openpyxl as xl
import matplotlib.pyplot as plt

def get_data(path):
    wb = xl.load_workbook(path,read_only=True)
    ws = wb.active
    max_row = ws.max_row
    max_col = ws.max_column
    date_lst = []
    profit_lst = []
    for row in ws.iter_rows(min_row=2,max_row=max_row,max_col=max_col):
      # print(row.value,row.value)
      date_lst.append(row.value)
      profit_lst.append(row.value)
    plt.plot(date_lst,profit_lst)
    plt.show()
      

path = r'C:\Users\xxx\Desktop\实例.xlsx'
get_data(path)

各位看看,为啥y坐标不是数值呢?我在开始选择read——only了啊。

rsj0315 发表于 2020-5-18 21:02:05

@zltzlt
@Twilight6

Twilight6 发表于 2020-5-18 21:16:36

rsj0315 发表于 2020-5-18 21:02
@zltzlt
@Twilight6

我不会xlsx的数据处理,你能告诉我D列,C列,E列数据怎么表示的吗?

Twilight6 发表于 2020-5-18 21:20:53

rsj0315 发表于 2020-5-18 21:02
@zltzlt
@Twilight6

y轴刻度设置
plt.yticks('y轴的数量填这')

要不直接表示最后一行的利润,反正那个就是D,C,E计算的结果

rsj0315 发表于 2020-5-18 22:07:53

Twilight6 发表于 2020-5-18 21:20
要不直接表示最后一行的利润,反正那个就是D,C,E计算的结果

我现在画的是第一问,时间与利润的二维坐标图。
但是不知道为啥利润的数值老是显示公式,如果显示成数值就应该是对的

hanjiang6607 发表于 2020-5-18 22:14:40

高手,高手!

rsj0315 发表于 2020-5-18 22:22:05

rsj0315 发表于 2020-5-18 21:00
各位看看,为啥y坐标不是数值呢?我在开始选择read——only了啊。

应该是data_only

import openpyxl as xl
import matplotlib.pyplot as plt

def get_data(path):
    wb = xl.load_workbook(path,data_only=True)
    ws = wb.active
    max_row = ws.max_row
    max_col = ws.max_column
    date_lst = []
    profit_lst = []
    for row in ws.iter_rows(min_row=2,max_row=max_row,max_col=max_col):
      # print(row.value,row.value)
      date_lst.append(row.value)
      profit_lst.append(row.value)
    plt.plot(date_lst,profit_lst)
    plt.show()


path = r'C:\Users\xxx\Desktop\实例.xlsx'
get_data(path)

rsj0315 发表于 2020-5-18 22:49:55

5条曲线汇合到一张图标了,mark下
代码如下:
import openpyxl as xl
import matplotlib.pyplot as plt

def get_data(path):
    wb = xl.load_workbook(path,data_only=True)
    ws = wb.active
    max_row = ws.max_row
    max_col = ws.max_column
    date_lst = []
    profit_lst = []
    price_lst = []
    sale_price_lst = []
    sale_num_lst = []
    profit_rate_lst = []
    for row in ws.iter_rows(min_row=2,max_row=max_row,max_col=max_col):
      # print(row.value,row.value)
      date_lst.append(row.value)
      profit_lst.append(row.value)
      price_lst.append(row.value)
      sale_price_lst.append(row.value)
      sale_num_lst.append(row.value)
      profit_rate_lst.append(row.value)
    return date_lst,profit_lst,price_lst,sale_price_lst,sale_num_lst,profit_rate_lst

def chart(x,y1,y2,y3,y4,y5):
    plt.plot(x,y1)
    plt.plot(x,y2)
    plt.plot(x,y3)
    plt.plot(x,y4)
    plt.plot(x,y5)
    plt.show()

path = r'C:\Users\xxx\Desktop\实例.xlsx'
get_data(path)
chart(*get_data(path))
下一步:
里边把成本画成柱状图,便于和售价曲线对比看。
现在没有区分A和B商品,最好把两个商品分开,图例显示。

rsj0315 发表于 2020-5-18 22:53:57

Twilight6 发表于 2020-5-18 21:16
我不会xlsx的数据处理,你能告诉我D列,C列,E列数据怎么表示的吗?

date_lst = []
    profit_lst = []
    price_lst = []
    sale_price_lst = []
    sale_num_lst = []
    profit_rate_lst = []
    for row in ws.iter_rows(min_row=2,max_row=max_row,max_col=max_col):
      # print(row.value,row.value)
      date_lst.append(row.value)
      profit_lst.append(row.value)
      price_lst.append(row.value)
      sale_price_lst.append(row.value)
      sale_num_lst.append(row.value)
      profit_rate_lst.append(row.value)
    return date_lst,profit_lst,price_lst,sale_price_lst,sale_num_lst,profit_rate_lst
把遍历出来的数值都append到一个列表里,然后return出来。
画图函数在去打散这个元组,进行数据选取画图。
画到17楼了,还有进一步的问题尝试,欢迎指导!

Twilight6 发表于 2020-5-18 22:56:07

rsj0315 发表于 2020-5-18 22:53
date_lst = []
    profit_lst = []
    price_lst = []


很强!!!{:10_268:}鼓掌!!
页: [1]
查看完整版本: openpyxl和excel的结合画折线图