点击查看【bilibili】

全代码

  1. #数据大屏.py
  2. from pyecharts.options import ComponentTitleOpts
  3. from pyecharts.charts import Bar, Grid, Line, Liquid, Page, Pie, Geo, Radar
  4. from pyecharts.components import Table
  5. from pyecharts import options as opts
  6. from pyecharts.commons.utils import JsCode
  7. from pyecharts.globals import ChartType, SymbolType
  8. from pyecharts.globals import ThemeType
  9. from pyecharts.faker import Faker
  10. import xlwings as xw
  11. import pandas as pd
  12. def read_excel(path, sheet_number):
  13. pd.set_option('display.max_columns', None) #解决表格多列时中间省略显示问题(本程序用不到)
  14. pd.set_option('display.max_rows', None) #解决表格多行时中间省略显示问题(本程序用不到)
  15. pd.set_option('display.width', 5000) #解决表格打印换行
  16. #读取excel文件中的数据
  17. app = xw.App(visible = False, add_book = False)
  18. #path = r"C:\Users\admin\Desktop\xlwings\时间轮播图\CDE化药各类注册申请接收情况.xlsx"
  19. workbook = app.books.open(path)
  20. worksheet = workbook.sheets[sheet_number]
  21. values = worksheet.range("A1").expand().options(pd.DataFrame, index = False).value
  22. print(values)
  23. workbook.close()
  24. app.quit()
  25. return values
  26. def table_base() -> Table:
  27. table = Table()
  28. #构造符合要求的数据
  29. path = "大屏数据.xlsx"
  30. sheet_number = 0
  31. values = read_excel(path, sheet_number)
  32. row1 = values["治疗领域"] #读取列数据
  33. row2 = values["创新品种"]
  34. row3 = values["靶点/机理"]
  35. row4 = values["项目进度"]
  36. headers_values = ["治疗领域", "创新品种", "靶点/机理", "项目进度"]
  37. data = []
  38. for i in range(len(row1)):
  39. line = [row1[i], row2[i], row3[i], row4[i]]
  40. data.append(line)
  41. print(data)
  42. #绘制表格
  43. #table = Table()
  44. headers = headers_values
  45. rows = data
  46. table.add(headers, rows)
  47. table.set_global_opts(
  48. title_opts=ComponentTitleOpts(title="创新项目进度",
  49. #subtitle="数据只是模拟-穿云蟒"
  50. )
  51. )
  52. return table
  53. def Geo_line() -> Geo:
  54. c = (
  55. Geo()
  56. .add_schema(maptype="china",
  57. #label_opts=opts.LabelOpts(is_show=True) #显示各省名字
  58. )
  59. .add(
  60. "",
  61. [("广州", 55), ("北京", 66), ("杭州", 77), ("重庆", 88), ("新疆", 35)],
  62. type_=ChartType.EFFECT_SCATTER,
  63. color="white",
  64. )
  65. .add(
  66. "geo",
  67. [("广州", "新疆"),("广州", "北京"), ("广州", "杭州"), ("广州", "重庆")],
  68. type_=ChartType.LINES,
  69. effect_opts=opts.EffectOpts(
  70. symbol=SymbolType.ARROW, symbol_size=6, color="blue" #移动箭头的参数
  71. ),
  72. linestyle_opts=opts.LineStyleOpts(curve=0.4), #线条的弯曲度
  73. )
  74. #.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  75. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,formatter='{b}',color='black')) #显示点标签为省名称
  76. .set_global_opts(title_opts=opts.TitleOpts(title="Geo-Lines"),
  77. visualmap_opts=opts.VisualMapOpts(),)
  78. )
  79. return c
  80. def bar_line() :
  81. path = "大屏数据.xlsx"
  82. sheet_number = 2
  83. values = read_excel(path, sheet_number)
  84. values = values.sort_values(by = "采购量",ascending = False) #数据按指定维度排序
  85. x_data = values['项目'].tolist()
  86. yvalues1 = values['使用量'].tolist()
  87. yvalues2 = values['库存量'].tolist()
  88. yvalues3 = values['长期未用量'].tolist()
  89. yvalues4 = values['预算量'].tolist()
  90. bar = (
  91. Bar(init_opts=opts.InitOpts(width="1176px", height="560px"))
  92. .add_xaxis(xaxis_data=x_data)
  93. .add_yaxis(
  94. series_name="使用量",
  95. y_axis = yvalues1,
  96. stack="stack1", #设置堆叠
  97. label_opts=opts.LabelOpts(is_show=False),
  98. )
  99. .add_yaxis(
  100. series_name="库存量",
  101. y_axis= yvalues2,
  102. stack="stack1", #设置堆叠
  103. label_opts=opts.LabelOpts(is_show=False),
  104. )
  105. .add_yaxis(
  106. series_name="长期未用量",
  107. y_axis= yvalues3,
  108. gap="0%",
  109. category_gap=20,
  110. label_opts=opts.LabelOpts(is_show=False),
  111. )
  112. .extend_axis(
  113. yaxis=opts.AxisOpts(
  114. name="金额",
  115. type_="value",
  116. min_=0,
  117. max_=400,
  118. interval=50,
  119. axislabel_opts=opts.LabelOpts(formatter="{value} 万元"), #°C
  120. )
  121. )
  122. .set_global_opts(
  123. title_opts=opts.TitleOpts(title="CYM 2020年研发项目物料采购使用图(demo)",
  124. subtitle="数据更新时间:2021-9-11"),
  125. legend_opts=opts.LegendOpts( pos_top="10%", pos_left="50%"), #设置图例
  126. tooltip_opts=opts.TooltipOpts(
  127. is_show=True, trigger="axis", axis_pointer_type="cross"
  128. ),
  129. xaxis_opts=opts.AxisOpts(
  130. type_="category",
  131. axislabel_opts=opts.LabelOpts(rotate=-30), #设置X轴标签倾斜
  132. axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
  133. ),
  134. yaxis_opts=opts.AxisOpts(
  135. name="",
  136. type_="value",
  137. min_=0,
  138. max_=400,
  139. interval=50,
  140. axislabel_opts=opts.LabelOpts(formatter="{value} 万元"),
  141. axistick_opts=opts.AxisTickOpts(is_show=True),
  142. splitline_opts=opts.SplitLineOpts(is_show=True),
  143. ),
  144. )
  145. )
  146. line = (
  147. Line()
  148. .add_xaxis(xaxis_data=x_data)
  149. .add_yaxis(
  150. series_name="预算量",
  151. yaxis_index=1,
  152. y_axis = yvalues4,
  153. label_opts=opts.LabelOpts(is_show=False),
  154. )
  155. )
  156. c = bar.overlap(line)
  157. return c
  158. def pie_K() :
  159. path = "大屏数据.xlsx"
  160. sheet_number = 3
  161. values = read_excel(path, sheet_number)
  162. #构造数据
  163. x_data = values['名称'].tolist()
  164. y_data = values['数量'].tolist()
  165. data = [[x_data[i], y_data[i]] for i in range(len(x_data))]
  166. print(data)
  167. print(len(data))
  168. #饼图的绘制
  169. c = (
  170. Pie()
  171. .add(
  172. "", #设置系列名称
  173. data, #设置数据
  174. center=["43%", "50%"], #设置图形所在的位置左右距离
  175. radius=["40%", "75%"], #设置环形饼图
  176. #rosetype="area" #设置为玫瑰图 radius 半径 area 面积
  177. )
  178. #.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"]) #设置颜色
  179. .set_global_opts(
  180. title_opts=opts.TitleOpts(title="Pie系列图的绘制"), #设置标题
  181. #legend_opts=opts.LegendOpts( pos_top="10%", pos_left="80%",orient="vertical"), #设置图例
  182. legend_opts=opts.LegendOpts( is_show=False,pos_top="90%"), #设置图例
  183. )
  184. .set_series_opts(
  185. label_opts=opts.LabelOpts(formatter="{b}: {c} \n({d}%)"), #设置显示标签
  186. tooltip_opts=opts.TooltipOpts( #设置鼠标触发显示标签
  187. trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
  188. )
  189. )
  190. )
  191. return c
  192. def liquid_data_precision() -> Liquid:
  193. c = (
  194. Liquid()
  195. .add(
  196. "lq",
  197. [0.3254],
  198. label_opts=opts.LabelOpts(
  199. font_size=50,
  200. formatter=JsCode(
  201. """function (param) {
  202. return (Math.floor(param.value * 10000) / 100) + '%';
  203. }"""
  204. ),
  205. position="inside",
  206. ),
  207. )
  208. .set_global_opts(title_opts=opts.TitleOpts(title="销售完成率"))
  209. )
  210. return c
  211. def page_draggable_layout():
  212. page = Page(layout=Page.DraggablePageLayout)
  213. page.add(
  214. pie_K(),
  215. Geo_line(),
  216. table_base(),
  217. liquid_data_precision(),
  218. bar_line(),
  219. )
  220. page.render("page_draggable_layout.html")
  221. if __name__ == "__main__":
  222. #page_draggable_layout()
  223. Page.save_resize_html("page_draggable_layout.html", cfg_file="chart_config.json", dest="my_new_charts.html")